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