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

Regex - Matching a pattern not containing a string

我看过其他类似的问题,但都是关于匹配的开头和结尾,这不是我要找的。

我想用语法匹配参数:

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

=之后的.*设置为非贪婪

(\{\{[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}}

在 Java 中,通常所有正则表达式都可以正常工作,但语法会发生变化。 使用双斜杠('\')而不是单斜杠。

试试这个:

(\{\{[A-Za-z0-9_-]*(?:=.*)?\}\})