Perl正则表达式获取模式之间的单词

Sas*_*Sas 4 perl shell-script regular-expression

我有一个使用 grep 的工作 perl 正则表达式。我试图了解它是如何工作的。

这是命令命令。

grep -oP '(?<=location>)[^<]+' testFile1.xml
Run Code Online (Sandbox Code Playgroud)

以下是内容 testFile1.xml

<con:location>C:/test/file1.txt</con:location></con:dataFile>/con:dataFiles></con:groupFile>
Run Code Online (Sandbox Code Playgroud)

这就是结果

C:/test/file1.txt
Run Code Online (Sandbox Code Playgroud)

我试图理解正则表达式,即这部分 (?<=location>)[^<]+

Sté*_*las 7

(?<=...)是一个后PCRE 算子。就其本身而言,它不匹配任何内容,而是充当条件(左侧的内容匹配...)。

(?<=X)Y匹配Y条件是左边的匹配X。在 中blahYfooXYbar,匹配第二个YX不是正在匹配的内容的一部分。在(?<=X)本身的零宽度(匹配)点之前只是Y。这里说明:

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

因为 with -ogrep只打印匹配的部分,这是一种让它打印后面的内容location>(这里匹配的是[^>]+:一个或多个 ( +) 非<字符 ( [^>]) 所以一切直到(但不包括)下一个<字符或结尾该行提供它不为空)。

另一种方法是使用\K(在较新版本的 PCRE 中)重置匹配部分的开始:

grep -Po 'location>\K[^>]+'
Run Code Online (Sandbox Code Playgroud)

请注意,-P-o是 GNU 扩展。使用pcregrep(另一个grep使用 PCRE 的实现)的最新版本(8.11 或更高版本),您还可以执行以下操作:

pcregrep -o1 'location>([^>]+)'
Run Code Online (Sandbox Code Playgroud)

-o1打印第一个(此处是唯一的)捕获的内容(...)