gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:43:22 25 4
gpt4 key购买 nike

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

我想用语法匹配参数:

{{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 - 正则表达式 - 匹配不包含字符串的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com