Неохотный quatnifier не работает в Javascript

Если в узле 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 ответа

Добавление начального и конечного якорей заставило регулярное выражение вести себя так, как нужно в Javascript

например /^\s*(.*?)\s*(<=|==|>=|[GL]?EQ)\s*(.*?)\s*(!(required|strong|medium|weak))?$/;

Спасибо @avinash-raj за предложение.

Если кто-нибудь может предложить объяснение, почему это работает, и если (.*?)группа на самом деле "неохотный квантификатор", я был бы благодарен.

Я предлагаю вам использовать начальный и конечный якоря.

^\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) сопровождается концом строки якоря. Таким образом, двигатель регулярных выражений пытается соответствовать до конца строки.

Другие вопросы по тегам