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。在 中blahYfooXYbar,与第二个匹配YX不是正在匹配的内容的一部分。其(?<=X)本身与零宽度 (假想)就在那之前Y。这里举例说明:

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

因为使用 时-ogrep仅打印匹配的部分,这是让它打印内容的一种方法location>此处匹配的是[^>]+:一个或多个 ( +) 非<字符 ( [^>]),因此直到(但不包括)下一个<字符或行尾的所有内容(前提是它不为空))。

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

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

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

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

(打印-o1一个捕获的内容(这里是唯一的))(...)

相关内容