2010-11-23 4 views
7

루비 1.8.7. 문자열의 시작 부분에 패턴을 일치시키기 위해 ^를 사용하는 정규식을 사용하고 있습니다. 문제는 패턴이 의 시작 부분에있는 문자열에 여전히 일치하는 경우입니다. 이것은 'm'수식어를 사용하면 기대할 수있는 동작이지만 그렇지 않습니다.루비 정규 표현식 :^m 수정 자없이 행의 시작과 일치합니까?

$ irb 
irb(main):001:0> str = "hello\ngoodbye" 
=> "hello\ngoodbye" 
irb(main):002:0> puts str 
hello 
goodbye 
=> nil 
irb(main):004:0> str =~ /^goodbye/ 
=> 6 

여기서 내가 뭘 잘못하고 있니?

+4

훌륭한 리소스 ... http://rubular.com/ –

답변

1

"^"는 줄의 시작입니다. 원하는 것을 만들기 위해 문자열을 분리하고 첫 번째 행만 테스트 할 수 있습니다. 하지만 나는 더 나은 방법이 있다고 생각합니다. 라인

str.split("\n")[0] =~ /^hello/ 
17
  • 시작 : 문자열 $
  • 시작 : 라인^
  • 단부 스트링의
  • 단부 \ : \ Z
7

귀하의 혼란이 정당화된다. 대부분의 정규 표현식에서 ^\A과 동일하고 $은 기본적으로 \Z과 같으며 "multiline"플래그를 설정하여 다른 의미 (즉, 선 경계)를 적용해야합니다. Ruby에서 ^$항상은 라인 경계에서 일치합니다.

루비는 "다중 라인"모드라고 부르는 것을 가지고 있지만 실제로는 "단선"또는 "DOTALL"모드라고 부릅니다. 이것은 . 메타 문자의 의미를 변경하여 일치하는 행 분리 기호 문자 (예 : \r, \n) 및 기타 모든 문자.

+0

설명하는 동작이 정규 표현식 중 어느 것입니까? –

+0

@Wayne : Perl, PHP, Python, JavaScript, Java, .NET ... "다중 행"모드가있는 경우 그 의미가 있습니다 :'^'는 "start"가됩니다. '$'는 "줄 끝"이됩니다. 루비의 접근 방식이 잘못되었다고 말하는 것은 아닙니다. 나는 그들이 그들이 한 것처럼 이름을 섞어 놓지 않았 으면 좋겠다. 실제로 제대로 된 유일한 맛은 "다중 라인"* 및 "단일 라인"모드를 제거하는 Perl 6/Parrot입니다. –

+0

예, Ruby가 \ A를 사용하는 것과 같은 방식으로 ^를 사용하는 C 및 Perl에서 정규 표현식을 사용했습니다. C 정규 표현식 라이브러리가 '결정적인'라이브러리라고 생각했습니다. 분명히 오인되었습니다. 귀하의 답변에 감사드립니다. – SteveRawlinson