Perl中的Ungreedy regexp

时间:2013-01-14 12:46:25

标签: regex perl non-greedy

我正在尝试捕获这样的字符串:

document.all._NameOfTag_ != null ;

如何捕获子字符串:

document.all._NameOfTag_

和标签名称:

_NameOfTag_

到目前为止我的尝试:

if($_line_ =~ m/document\.all\.(.*?).*/)
{

}

但它总是贪婪并捕获_NameOfTag_ != null

3 个答案:

答案 0 :(得分:6)

懒惰的(.*?)将始终不匹配,因为以下贪婪的.*将始终匹配所有内容。

你需要更具体:

if($_line_ =~ m/document\.all\.(\w+)/)

仅匹配document.all.

后的字母数字字符

答案 1 :(得分:2)

你的问题是懒惰的量词。延迟量词将始终首先尝试取消与正则表达式中下一个组件的匹配,并且只有在所述下一个组件不匹配时才会使用该文本。

但是,您的下一个组件是.*.*会匹配所有内容,直到输入结束。

请改用:

if ($_line_ =~ m/document\.all\.(\w+)/)

并且还要注意,并不要求所有文本都匹配。正则表达式只需匹配它所匹配的内容,而不是其他内容。

答案 2 :(得分:0)

尝试以下方式,个人我觉得更清楚:

document\.all\.([^ ]*)