Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl非贪婪正则表达式大小写匹配过多_Regex_Macos_Perl_Html Parsing - Fatal编程技术网

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"
(.*?)