Perl regex get word entre um padrão

4

Eu tenho um regex perl de trabalho usando o grep. Estou tentando entender como isso funciona.

Aqui está o comando comando.

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

Aqui estão os conteúdos de testFile1.xml

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

E este é o resultado

C:/test/file1.txt

Estou tentando entender a regex, ou seja, esta parte (?<=location>)[^<]+

    
por Sas 20.10.2016 / 17:36

1 resposta

7

(?<=...) é um operador de PCRE look-behind . Por si só, não corresponde a nada, mas age como uma condição (o que está à esquerda corresponde a ... ).

(?<=X)Y corresponde a Y , desde que o que está à esquerda corresponda a X . Em blahYfooXYbar , que corresponde ao segundo Y , o X não faz parte do que está sendo correspondido. O (?<=X) em si corresponde ao ponto de largura zero ( imaginário ) pouco antes desse Y . Aqui ilustrado:

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

Como -o , grep apenas imprime a parte correspondida , é uma maneira de imprimir o que é após o location> (aqui o que corresponde a [^>]+ : um ou mais ( + ) não < caracteres ( [^>] ) então tudo até (mas não incluído) o próximo caractere < ou o final da linha desde que não esteja vazio). / p>

Outra abordagem é usar \K (em versões mais recentes do PCRE) para redefinir o início da parte correspondente:

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

Observe que -P e -o são extensões do GNU. Com versões recentes (8.11 ou superiores) de pcregrep (outra implementação grep que usa o PCRE), você também pode fazer:

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

( -o1 imprime o que é capturado pelo 1 com (aqui exclusivo) (...) )

    
por 20.10.2016 / 17:47