패턴 사이의 단어를 얻는 Perl 정규식

패턴 사이의 단어를 얻는 Perl 정규식

grep을 사용하여 작동하는 Perl 정규 표현식이 있습니다. 나는 그것이 어떻게 작동하는지 이해하려고 노력하고 있습니다.

다음은 명령 명령입니다.

grep -oP '(?<=location>)[^<]+' testFile1.xml

다음은 내용이다testFile1.xml

<con:location>C:/test/file1.txt</con:location></con:dataFile>/con:dataFiles></con:groupFile>

이것이 결과다

C:/test/file1.txt

정규식을 이해하려고 노력 중입니다. 즉, 이 부분(?<=location>)[^<]+

답변1

(?<=...)뒤를 봐PCRE 연산자. 그 자체로는 아무것도 일치하지 않지만 오히려 조건으로 작동합니다(왼쪽에 있는 것이 무엇이든 일치 ...).

(?<=X)Y일치 Y전제는 왼쪽의 내용이 일치한다는 것입니다 X. in 은 blahYfooXYbar두 번째 것과 일치하며 Y일치 X되는 항목의 일부가 아닙니다. 그 자체 (?<=X)는 너비가 0인 것과 같습니다(상상의) 그 직전에요 Y. 예는 다음과 같습니다.

$ echo X-RAY THE FOX | perl -lpe 's/(?<=X)/<there>/g'
X<there>-RAY THE FOX<there>

를 사용할 때는 -o인쇄 grep만 하기 때문에일치섹션에 무언가를 인쇄하는 한 가지 방법이 있습니다.뒤쪽에( location>여기서 일치하는 것은 [^>]+하나 이상의 ( +) <문자가 아닌 ( )이므로 다음 문자 또는 줄 끝 (비어 있지 않은 경우) [^>]까지의 모든 것입니다 .<

또 다른 방법은 \K(최신 버전의 PCRE에서) 다음을 사용하여 일치하는 부분의 시작을 재설정하는 것입니다.

grep -Po 'location>\K[^>]+'

-P및 은 -oGNU 확장입니다. pcregrep최신 버전(8.11 이상)(다른 PCRE 구현 사용) 의 경우 grep다음을 수행할 수도 있습니다.

pcregrep -o1 'location>([^>]+)'

( 처음-o1 캡처한 내용을 인쇄합니다(여기서는 하나만))(...)

관련 정보