不情愿的量词不适用于Javascript

时间:2014-12-29 16:55:07

标签: java javascript regex reluctant-quantifiers

如果在节点v0.10.26中调用以下函数:

    function parseAndLog(constraint) {
        var constraintRegex = /\s*(.*?)\s*(<=|==|>=|[GL]?EQ)\s*(.*?)\s*(!required|!strong|!medium|!weak)?/;
        console.log(constraintRegex.exec(constraint));
    }

输入:

"thumb.top == group.top + 20"

我预计以下内容将作为子字符串匹配返回(就像在Java中调用类似的函数时那样)

thumb.top 
==
group.top + 20

但只返回以下内容

thumb.top 
==

我希望"group.intrinsicHeight == preamble.bottom !medium"能够

group.intrinsicHeight
==
preamble.bottom
!medium

但只能获得以下

group.intrinsicHeight
==

我怀疑这个问题与(.*?)群体有关。我认为这被称为不情愿的量词。甚至是Javascript支持吗?如果没有,是否有解决方法?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我建议你使用开始和结束锚点。

^\s*(.*?)\s*(<=|==|>=|[GL]?EQ)\s*(.*?)\s*(!required|!strong|!medium|!weak)?$

DEMO

String str = "thumb.top == group.top + 20\n" + 
             "group.intrinsicHeight == preamble.bottom !medium";
Matcher m = Pattern.compile("(?m)^\\s*(.*?)\\s*(<=|==|>=|[GL]?EQ)\\s*(.*?)\\s*(!required|!strong|!medium|!weak)?$").matcher(str);
while(m.find())
{
    if(m.group(1) != null)  { System.out.println(m.group(1)); }
    if(m.group(1) != null)  { System.out.println(m.group(2)); }
    if(m.group(1) != null)  { System.out.println(m.group(3));  }
    if(m.group(1) != null)  { System.out.println(m.group(4)); }
}

因为您描述了除(<=|==|>=|[GL]?EQ)以外的所有模式重复零次或多次。所以它并不关心是否存在以下(!required|!strong|!medium|!weak),因为您将此模式设为可选。通过添加开始和结束锚点,它确保可选的(!required|!strong|!medium|!weak)后跟行锚点的结尾。所以正则表达式引擎试图匹配到行结束。

答案 1 :(得分:1)

添加开始和结束锚点使正则表达式在Javascript

中按照需要运行

e.g。 /^\s*(.*?)\s*(<=|==|>=|[GL]?EQ)\s*(.*?)\s*(!(required|strong|medium|weak))?$/;

感谢@ avinash-raj的建议。

如果有人可以解释为什么会这样做,而(.*?)群实际上是一个不情愿的量词&#34;,我将不胜感激。