不情愿的quatnifier在Javascript中不起作用

Reluctant quatnifier not working in Javascript

本文关键字:不起作用 Javascript quatnifier 不情愿      更新时间:2023-09-26

如果在节点 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支持吗?如果没有,是否有解决方法?任何帮助非常感谢。

添加开始和结束锚点使正则表达式在 Javascript 中按预期运行

例如 /^'s*(.*?)'s*(<=|==|>=|[GL]?EQ)'s*(.*?)'s*(!(required|strong|medium|weak))?$/;

感谢@avinash-raj的建议。

如果有人能解释为什么会这样,如果(.*?)组实际上是一个"不情愿的量词",我将不胜感激。

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

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

演示

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)后跟行锚点的末尾。所以正则表达式引擎试图匹配到行端。