재고

2011-03-27 4 views
4
  1. ^이 줄의 시작 일치라고 앵커,하지만 바로 "\n", "\r" 또는 "\r\n" 후 일치하지 않습니다. 그것은 문자열의 시작과 일치합니다. 어떤 의미에서 라인의 시작과 일치합니까? \A과 다른 점은 무엇입니까?재고

  2. $

    는 라인
    끝과 일치라고하지만, 바로 "\n", "\r" 또는 "\r\n" 사전이 일치하지 않습니다. 그것은 문자열의 끝과 일치합니다. 어떤 의미에서 라인의 끝과 일치합니까? \z과 어떻게 다른가요?

  3. \Z\z과 달리 문자열 끝 부분 인 "\n"과 일치합니다. \A\z은 자연스럽게 쌍으로 된 개념이며 \Z은 다소 이상한 것 같습니다. \Z\z이있는 그대로 정의 된 이유는 무엇입니까? 언제 \Z을 사용 하시겠습니까?

위의 예를 사용하여 설명 할 수 있습니까? 언어/표준 간의 차이가 중요한 경우이를 나열하는 것이 도움이됩니다.

답변

4

차이점은 ^$ 앵커가 동작을 수정할 수 있다는 것입니다.

multiline 모드로 설정하면 ^$ 앵커가 라인의 시작과 끝을 표시합니다.

multiline 모드를 해제하면 ^$ 앵커가 문자열의 시작과 끝을 표시합니다.


대부분의 정규식 구현은 multiline 모드입니다.

Ruby, Perl 또는 Javascript에서는 m 수정 자로 정의됩니다. 예 : /pattern/m

.NET에서는 패턴 내부에 (?m) 또는 RegexOptions.Multiline 열거 형으로 정의됩니다.


3 번째 질문에 대답하려면 ...

\A는 - 경기는 문자열의 시작 부분에서 발생해야합니다.

\Z - 일치 여부는 문자열 끝 또는 \n 문자열 끝 부분에서 발생해야합니다.

\z - 문자열의 끝에서 일치가 발생해야합니다.

이 세 가지는 수정 자의 영향을받지 않는 상수입니다.\A\z은 비논리적 인 쌍으로 보이는 것에 동의합니다. 나에게도 큰 의미가 없다. 그러나 당신이 일 수 있고가 당신이 무시하고 싶은 꼬리표 줄 먹이가있는 경우에 \Z는 선호 될지도 모르다.

+1

+1 다중 행 수정자는 PHP와 Python에서도 이와 같이 작동합니다. – ridgerunner

+1

루비에서'm' 수식어는 대부분의 언어가's' 수식어 (일명 : DOT ALL)를 고려하는 것을 나타냅니다. 인용문 : _ "/ m은 점 매칭 뉴 라인을 만듭니다. 루비는 실제로/m을 사용하지만, Perl 및 다른 많은 프로그래밍 언어는"점 매칭 개행 "에/s를 사용합니다."_ from : http://www.regular-expressions.info /ruby.html –

+1

또한 대부분의 PCRE 계열 정규 표현식은'(? m)'과 같은 인라인 수정자를 지원합니다. 이것은 .NET에만 국한되지 않습니다. –

관련 문제