0

我有一个类似的file东西

<post href="http://example.com/" description="Example website" tag="more text"/>

我想要得到的是Example website. 正在做:

cat file | perl -pe 's/.*description=".*?"//'

按预期工作,我得到了tag="more text"/>,但是在尝试时:

cat file | perl -pe 's/.*description="(.*)?"/\1/'

我得到Example website" tag="more text/>了,而我期待得到Example website。所以似乎捕获和反向引用的某些东西没有按预期工作,虽然我想我可能明白为什么,但我不确定如何解决它。

我总是可以这样做:

cat file | perl -pe 's/.*description="//;s/".*//'

但我真的很想了解如何用正则表达式解决它,而不是做两次替换。

4

2 回答 2

1

您没有使用非贪婪,您在可选的捕获组中具有贪婪,因为问号就在组的结束括号之后:

改变:

description="(.*)?"

到:

description="(.*?)"

你应该有你预期的结果。

于 2013-08-23T01:19:24.573 回答
1

?字符在正则表达式中有两种含义。

当它跟在一个类似*+允许表达式匹配可变次数的字符之后时,它是“非贪婪”修饰符。

.*?
a+?
(foo){3,}?               # actually, I'm not sure about this one

在其他情况下,它的意思是“匹配 0 次或 1 次”

abc?d                    # matches "abcd" or "abd"

通过将?捕获组放在外部,您已将其更改为第二个含义。就像@smerny 说的那样,把它放在捕获组中。

(.*?)
于 2013-08-23T01:36:34.430 回答