如果在节点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支持吗?如果没有,是否有解决方法?非常感谢任何帮助。
答案 0 :(得分:1)
我建议你使用开始和结束锚点。
^\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)
后跟行锚点的结尾。所以正则表达式引擎试图匹配到行结束。
答案 1 :(得分:1)
添加开始和结束锚点使正则表达式在Javascript
中按照需要运行 e.g。 /^\s*(.*?)\s*(<=|==|>=|[GL]?EQ)\s*(.*?)\s*(!(required|strong|medium|weak))?$/;
感谢@ avinash-raj的建议。
如果有人可以解释为什么会这样做,而(.*?)
群实际上是一个不情愿的量词&#34;,我将不胜感激。