正则表达式 - 匹配不包含字符串的模式

时间:2015-01-15 08:27:02

标签: java regex

我已经看到了其他类似的问题,但它们都是关于最后开始时的匹配,这不是我想要的。

我希望将参数与语法匹配:

{{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中使用它。

2 个答案:

答案 0 :(得分:6)

.*之后的=视为非贪婪。

(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})

DEMO

Java正则表达式,

"(\\{\\{[a-zA-Z0-9_-]*(?:=.*?)?\\}\\})"

(\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\})

DEMO

在此,我使用.*?修改了可选非捕获组内的(?:(?!}}).)*

  • (?!..)称为负前瞻断言。这不会匹配任何角色,但断言匹配将发生在特定的地方。这里(?!}}).检查我们要匹配的字符不会是}}的条件。这是以下字符不会成为}}

  • 中的第一个结束花括号
  • 如果是,则只匹配相应的字符。

  • 因此(?:(?!}}).)*匹配任何字符,但不匹配}}零次或多次。 ?旁边的*会使*进行非贪婪的匹配。请注意,这将匹配单个结束花括号。

代码:

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_-]*(?:=.*)?\\}\\})