2014-04-16 6 views
1

(?=regex)을 내다 및 (?<=regex)을 lookbehind하고 이해하는 데 도움이 필요 lookbehind. 는 펄 내다에 의해 혼란 내가 펄에 의해 혼란 스러워요

이 내다가 look to the right of (?=regex)

가 나는 또한 lookbehind (? < = 정규식)에만 고정 폭 정규식 작동 것으로 나타났습니다 look to the left of (?<=regex)

의미 lookbehind 하는가 의미 하는가, 나는 다음 질문을 간단한 예제를 사용합니다.

예를 들어, 코드의 다음 줄을주고, 나는 번호와 일치하고 싶지만 경우에만 코멘트 라인에 있지 않습니다. 내가 작동하지 않았다

/(?<!^#)\d/ 
match a number if the line does not start with # 

다음 시도 그래서 그렇지, 1

#Comment 1 
my $number = 2 

2 일치해야합니다, 그것은 고정 된 폭 lookbehind 정규식하지 않기 때문에이다?

감사

+0

어떤 언어 당신은 구문 분석하려고? –

+0

나는 Perl 정규 표현식을 가르치고 있는데, 예를 들어 그 코드 만 사용하십시오. –

+0

문맥과 규칙이 없어도 질문에 이해가되지 않습니다. –

답변

5

수정, 내다 및 lookbehinds은 정규식 내부에있는 곳에서 검색 할 수 있습니다. 이 문자열의 시작에 # 다음 즉시을 아니에요 그래서 당신의 예를 /(?<!^#)\d/는 긴 숫자와 일치합니다. 예를 들어

:

my $string = "123 #456 #789" 
while ($string =~ /(?<!#)(\d+)/g) { 
    print $1; 
} 

1235689를 인쇄합니다. 그들은 즉시

이 특정 정규식에 대해 이야기하려면 #

업데이트가 선행되기 때문에 만 4, 7 건너 뜁니다 :

use strict; 
use warnings; 

my $string = "#123 #456 #789"; 
while ($string =~ /(?<!^#)(\d+)/g) { 
    print $1; 
} 

은 위의 23456789를 인쇄 할 만하기 때문에 숫자 1 앞에는 문자열 시작 부분에 #이옵니다.

+0

내가 아직 (? <^ #) 생각하지 나타납니다 고정 폭 lookbehind입니까? –

+0

나는 그것을 얻었다 고 생각한다.'^'는 lookbehind에서 줄의 시작이 아닌 문자열의 시작을 의미한다. –

+1

@AskandLearn : * *는 고정 길이로되어 있습니다. 네가 당혹 스럽네?'^'는 내부와 외부에서 룩백 (look-behind)으로 동작합니다. '/ m' 한정자가 적용되면 문자열의 시작 부분과 개행 직후의 부분을 일치시킵니다. – Borodin

관련 문제