我已经看到了其他类似的问题,但它们都是关于最后开始时的匹配,这不是我想要的。
我希望将参数与语法匹配:
{{param-name}}
或{{param-name=default value}}
到目前为止,我有以下正则表达式:
(\{\{[a-zA-Z0-9_-]*(?:=.*)?\}\})
但问题是如果有多个参数,它只创建一个匹配:从第一个开始到最后一个结束。例如:
bla bla {{foo=blabla}} bla bla {{bar=hehe}} bla bla
我希望{{foo}} bla bla {{bar=hehe}}
和{{foo}}
{{bar=hehe}}
所以我需要在=
字符后检查}}
终止参数之前没有}}
字符串。
我不知道该怎么做。你能帮助我吗 ? 谢谢:))
PS:如果重要的话,我在Java中使用它。
答案 0 :(得分:6)
将.*
之后的=
视为非贪婪。
(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})
Java正则表达式,
"(\\{\\{[a-zA-Z0-9_-]*(?:=.*?)?\\}\\})"
或强>
(\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\})
在此,我使用.*?
修改了可选非捕获组内的(?:(?!}}).)*
。
(?!..)
称为负前瞻断言。这不会匹配任何角色,但断言匹配将发生在特定的地方。这里(?!}}).
检查我们要匹配的字符不会是}}
的条件。这是以下字符不会成为}}
如果是,则只匹配相应的字符。
因此(?:(?!}}).)*
匹配任何字符,但不匹配}}
零次或多次。 ?
旁边的*
会使*
进行非贪婪的匹配。请注意,这将匹配单个结束花括号。
代码:
String s = "bla bla {{foo}} bla bla {{bar=hehe}} bla bla";
Matcher m = Pattern.compile("\\{\\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\\}\\}").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
输出:
{{foo}}
{{bar=hehe}}
答案 1 :(得分:-1)
在Java中通常所有正则表达式都可以正常工作,但语法会发生变化。 使用双斜杠(' \')而不是单曲。
试试这个:
(\\{\\{[A-Za-z0-9_-]*(?:=.*)?\\}\\})