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