Regex perl非贪婪正则表达式大小写匹配过多
我有一个Regex perl非贪婪正则表达式大小写匹配过多,regex,macos,perl,html-parsing,Regex,Macos,Perl,Html Parsing,我有一个文件,里面有 <post href="http://example.com/" description="Example website" tag="more text"/> 工作正常,我得到tag=“更多文本”/>,但尝试时: cat file | perl -pe 's/.*description="(.*)?"/\1/' 我得到了示例网站“tag=”more text/>,而我本来希望得到示例网站。所以,似乎在捕获和反向引用方面存在一些不符合预期的情况,尽管我认为我
文件
,里面有
<post href="http://example.com/" description="Example website" tag="more text"/>
工作正常,我得到tag=“更多文本”/>
,但尝试时:
cat file | perl -pe 's/.*description="(.*)?"/\1/'
我得到了示例网站“tag=”more text/>
,而我本来希望得到示例网站
。所以,似乎在捕获和反向引用方面存在一些不符合预期的情况,尽管我认为我可能理解为什么,但我不确定如何解决它
我总是可以做到:
cat file | perl -pe 's/.*description="//;s/".*//'
但是我真的想了解如何用正则表达式来解决它,而不是做两次替换。您没有使用非贪婪,您在可选的捕获组中有贪婪,因为问号就在组的结束括号后面: 更改:
description="(.*)?"
致:
您应该会得到预期的结果。元字符在正则表达式中有两种含义 当它跟在像
*
或+
这样的字符后面,允许表达式进行可变次数的匹配时,它是“非贪婪”修饰符
.*?
a+?
(foo){3,}? # actually, I'm not sure about this one
它
在其他上下文中,它表示“匹配0或1次”
通过将?
置于捕获组之外,您已将其更改为第二种含义。就像@smerny说的,把它放在捕获组里
(.*?)
我考虑过(并尝试过)这一点,但它不起作用,我现在意识到了为什么,我忘了放尾部的
*
,所以它应该是cat file | perl-pe的/*description=“(.*?)”*/\1/'
。我仍然会接受答案,谢谢。如果您希望捕获组只包含描述值,那么我的答案中的更改仍然是必要的。不要使用正则表达式解析HTML。使用适当的HTML解析模块。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的Perl模块正确解析HTML的示例,请参阅。我知道我不应该尝试使用正则表达式解析HTML,但这是响应API调用得到的XML代码,因此它不会偏离,因为它已经只包含我感兴趣的内容。如果API响应发生变化,我的代码也必须进行调整,但在这种情况下,不会有任何不可预见的情况使正则表达式变得“危险”。
.*?
a+?
(foo){3,}? # actually, I'm not sure about this one
abc?d # matches "abcd" or "abd"
(.*?)