gpt4 book ai didi

java - Java 中的 Regexp 分组和 replaceAll with .* 重复替换

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:13 25 4
gpt4 key购买 nike

我在 Java 中使用 Rexexp 时遇到问题。示例代码写出 ABC_012_suffix_suffix,我期待它输出 ABC_012_suffix

    Pattern rexexp  = Pattern.compile("(.*)");
Matcher matcher = rexexp.matcher("ABC_012");
String result = matcher.replaceAll("$1_suffix");

System.out.println(result);

我知道 replaceAll 会替换所有匹配的组,问题是为什么这个正则表达式组 (.*) 在我的 Java 字符串 ABC_012 上匹配两次?

最佳答案

Pattern regexp  = Pattern.compile(".*");
Matcher matcher = regexp.matcher("ABC_012");
matcher.matches();
System.out.println(matcher.group(0));
System.out.println(matcher.replaceAll("$0_suffix"));

同样发生在这里,输出是:

ABC_012
ABC_012_suffix_suffix

原因隐藏在replaceAll 方法中:它试图找到所有匹配模式的子序列:

while (matcher.find()) {
System.out.printf("Start: %s, End: %s%n", matcher.start(), matcher.end());
}

这将导致:

Start: 0, End: 7
Start: 7, End: 7

因此,令我们惊讶的是,匹配器 找到 两个子序列,“ABC_012” 和另一个 “”。并将 "_suffix" 附加到它们:

"ABC_012" + "_suffix" + "" + "_suffix"

关于java - Java 中的 Regexp 分组和 replaceAll with .* 重复替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029042/

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