我有一个使用 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
,与第二个匹配Y
,X
不是正在匹配的内容的一部分。其(?<=X)
本身与零宽度 (假想)就在那之前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
和-o
是 GNU 扩展。对于pcregrep
(使用 PCRE 的另一个实现)的最新版本(8.11 或更高版本)grep
,您还可以执行以下操作:
pcregrep -o1 'location>([^>]+)'
(打印第-o1
一个捕获的内容(这里是唯一的))(...)