gpt4 book ai didi

Java多次匹配同一个组

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:02 25 4
gpt4 key购买 nike

我需要在一系列字符中多次匹配相同的模式。

例如:对于输入 Some words <firstMatch> some words <secondMatch> some more words <ThirdMatch>我需要 <firstMatch> , <secondMatch> , <thirdMatch>

我试过这样的:

String input = "Some words <firstMatch> some words <secondMatch> some more words <ThirdMatch>";
Pattern pattern = Pattern.compile( ".*(\\<.*\\>).*" );
Matcher m = pattern.matcher( input );
while ( m.find() ) {
System.out.println( m.group( 1 ) );
}

我得到的是ThirdMatch

有什么帮助吗?

最佳答案

为什么您的模式会失败?

.*(\\<.*\\>).*涉及很多回溯。一、.*匹配除换行符以外的任何 0+ 个字符,基本上是整行。然后,正则表达式引擎回溯以尝试适应后续模式 (<.*>).*。 .当它找到 < (从末尾开始),它将再次抓取整行,并继续回溯搜索 >。 .一旦找到,最后一个.*只匹配该行的其余部分。请注意,如果引擎找不到 >< 之后, 回溯将重复搜索,使这种模式相当低效。注:<>不必在 Java 正则表达式模式中转义,它们不是特殊的正则表达式元字符。

解决方案

使用更简单的 "<[^>]*>"基于 negated character class 的模式:

String input = "Some words <firstMatch> some words <secondMatch> some more words <ThirdMatch>";
Pattern pattern = Pattern.compile( "<[^>]*>" );
Matcher m = pattern.matcher( input );
while ( m.find() ) {
System.out.println( m.group(0) ); // = m.group(), the whole match value
}

参见 Java demo

<[^>]*>将匹配 < , 除 > 以外的 0+ 个字符, 然后 > .由于您使用的是 Matcher#find()while block ,您将在输入字符串中找到所有非重叠匹配项,但您需要访问 .group(0) (等于 .group() ,整个匹配值),而不是 .group(1) .

关于Java多次匹配同一个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40339579/

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