MatchData에서 begin 및 end 구현 방법
3975 단어 re2
묘사
업데이트된 @driskell's#21(0.6.1 기반).불행하게도 터미널을 재정비하는 것은
begin
과 end
의 기능을 파괴한 것 같다. 둘 다 상대적으로 정확하지만, 모두 무작위 쓰레기를 포함하는 것 같아 숫자가 나빠질 수 있다.바늘 산수 문제 같은 냄새가 나는데, 좀 볼 수 있을까요, @driskell?토론 #1
1050 정도에 변화가 하나 부족합니다.https://github.com/mudge/re2/pull/21/files#diff-e23c54ff6a986f6e4e97f67de7344d98R1122
기본적으로 구조에 저장된 텍스트 문자열은 RE2에 지정된 텍스트 문자열과 동일해야 합니다.RE2는 새 문자열을 반환하지 않고 전달된 문자열의 오프셋 및 길이만 반환합니다.
이 패치에서 RE2는 우리가 저장한 문자열과 다르기 때문에, 두 문자열이 메모리에 있는 거리와 같은 임의의 문자열을 포함할 것이다.
토론 #2
아, 그럼요.너무 좋아요. 놓쳐서 미안해요.나는 이미 제출을 수정했기 때문에 이것은 보기에 매우 좋다.제출 (한 번 추가
begin
와 end
및 그 규범) 으로 접어서 생성된 문서를 검사하고, 자술한 파일에 공헌을 기록할 수 있다면?토론 #셋
너무 좋아요. 감사합니다.rb Stru len의 일을 보러 갈 시간이 별로 없지만, 지금은 괜찮을 것이다. 아마도 내가 언제 시작하든지, 아니면 다른 사람이 할 것이다. 나는 확신한다.토론 #4
우울한 것은rb_str_length
루비2+버전만 있는 것 같다는 것이다.더 호환되는 RSTRING_LEN
를 사용하면 바이트 크기를 다시 되돌릴 것 같습니다. (인코딩을 모를 수도 있습니다.)Ruby 1.9에 대해서는
# encoding: utf-8
에 신기한 주석spec/re2/match_data_spec.rb
을 추가해야 한다. 그렇지 않으면 멀티바이트 문자로 인해 이상이 발생할 수 있다.현의 길이를 더욱 일치시킬 수 있는 다른 생각은 없습니까?아마도 우리는 C 함수를 직접 사용하지 않고
length
호출할 수 있을 것이다.토론 #5
James Edward Gray's "Bytes and Characters in Ruby 1.8"에서 몇 가지 권장 사항을 사용할 수 있습니다. 즉,"some string".scan(/./mu).size
Ruby 버전에서 문자열의 문자 수를 가져오는 것입니다.이것은 순수 루비에서 가장 좋을 수 있기 때문에, 나는 루비에서
begin
와 end
을 실현하려고 시도했다. 방법은 C API에서 편이량 문자열을 되돌려주고 scan
그것들을 정렬하는 것이다.토론 #6
죄송합니다. 제가 가리키는 것은 보는 것rb_str_sublen
(아니오rb_str_len
-그것은 실제로 존재하지 않습니다.)현재 begin()과 end()는 일치하는 이전 문자를 포함하는 루비 문자열을 실제로 할당하고 있습니다.그리고
rb_str_length
를 사용하여 다자 바이트 감지 계수를 한다.rb_str_sublen
를 사용하면 Ruby 대상을 분배하지 않은 상태에서 멀티바이트 감지 계수를 할 수 있어 분배를 절약할 수 있다. 왜냐하면 우리는 정수 하나만 되돌려주면 바로 쓰레기가 되기 때문이다.지금 나는 이 두 개가 모두 Ruby 1.9에서 사용할 수 있다는 것을 확신하지만, 아마도 잘못된 것일 것이다.버튼 좀 눌러줄래요?트라비스가 뭐라고 하는지 볼까?
토론 #7
rb_str_sublen
와 rb_str_length
둘 다 믿을 만해야 한다(Ruby 버전에서 사용할 수 있다고 가정한다)전자만 대상 분배와 실시간 쓰레기를 피할 수 있다.토론 #8
루비에서 사용begin
과end
추송은 통과된 구축을 사용했다(그러나 C에서 새로운 until_begin
와until_end
:magic comment는 1.9를 복원했지만 루비 Enterprise Edition과 루비 1.8은 모두 부족rb_str_length
과RSTRING_LEN
는 바이트만 되돌려준다(전자는 1.9에 도입된 것으로 보인다.http://rxr.whitequark.org/mri/ident?v=1.8.7-p374&i=rb_str_sublen).1.8버전
rb_str_sublen
이 있어도 우리는 1.9 이전의 문자 수가 아니라 문자열 크기가 바이트 수에 불과하기 때문에 Regexp 기술을 사용해야 한다고 의심한다.가능하다면 1.8과 호환성을 유지하고 싶지만 필요하다면 포기할 수 있다고 생각하십니까?
토론 #9
실제로rb_str_sublen
ENCODED_STR_NEW
宏과 매우 유사)할 수 있다면 RSTRING_LEN
를 사용하여 알 수 없는 루비를 인코딩하는 것은 나쁜 생각이 아닐 수도 있다.나는 루비 1.8에 대해 편이량은 바이트이고 >=1.9에 대해서는 문자(그렇기 때문에string[offset..-1]
의 행위가 일치해야 한다는 논점을 제기할 수 있다.네, 동의합니다.Ruby 1.8의 경우 길이가 바이트인 경우 begin () end () 는 바이트를 반환해야 합니다.토론 #10
차이가 많지 않다. 로빈니우스가 부족한 것 같다토론 #11
. 비록 설정이 있지만rb_str_sublen
.만약 다른 문자열 함수가 모두 자리에 앉았다면, 부족한 실현을 넣을 수 있습니다.그렇지 않으면 언제든지 변경 사항을 확인하고 당신의 생각을 알려 주십시오.HAVE_RUBY_ENCODING_H
LGTM, 감사합니다!rb stru sublen이 일하는 것을 보니 매우 기쁩니다.틀림없이 나의 원시 작업 복사본에서 뭔가 이상하다/이상한 곳이 그것을 망가뜨렸다.루빈니우스에 관해서는 확실하지 않습니다.최악의 경우, 그것은 내가 처음에 했던 것처럼 루비 문자열을 나누어 계산하고 버릴 것이다.그러나 rb str sublen을 재구성할 수 있는 경우에도 이 기능이 사용됩니다.아마도 이런 코드도 루빈니우스에게 미루어야 하는지 볼 만할 것이다.
토론 #12
드디어!다 지나갔어.나는 역사를 더욱 선형적인 것으로 압축하여 자술한 파일을 업데이트하고 마스터에 통합하여 0.7.0을 내놓았다.참아줘서 고마워.
Reference
이 문제에 관하여(MatchData에서 begin 및 end 구현 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/mudge/re2/issues/22텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)