【问题标题】:Ungreedy regexp in PerlPerl中的不贪婪的正则表达式
【发布时间】:2013-01-14 12:46:24
【问题描述】:

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

document.all._NameOfTag_ != null ;

如何捕获子字符串:

document.all._NameOfTag_

和标签名称:

_NameOfTag_

到目前为止我的尝试:

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

}

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

【问题讨论】:

    标签: regex perl non-greedy


    【解决方案1】:

    懒惰的(.*?) 永远不会匹配任何东西,因为后面的贪婪.* 永远匹配任何东西。

    你需要更具体:

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

    只会匹配document.all.之后的字母数字字符

    【讨论】:

      【解决方案2】:

      您的问题是惰性量词。惰性量词总是首先尝试取消匹配正则表达式中的下一个组件,并且仅当所述下一个组件不匹配时才会使用文本。

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

      改用这个:

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

      还要注意,不需要匹配所有文本。正则表达式只需要匹配它必须匹配的内容,不需要其他任何东西。

      【讨论】:

        【解决方案3】:

        改用以下方法,个人觉得更清楚:

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

        【讨论】:

        • +1,尽管如果标签名称和比较运算符之间没有空格(这是合法的),这将失败。
        • @TimPietzcker 啊,是的,这让我们很好地表明 OP 似乎正在尝试解析一种非常规语言。
        猜你喜欢
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        相关资源
        最近更新 更多