我有这段代码,我想知道是否可以仅替换 Java 正则表达式中的组(而不是所有模式)。
代码:
//...
Pattern p = Pattern.compile("(\\d).*(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
//Now I want replace group one ( (\\d) ) with number
//and group two (too (\\d) ) with 1, but I don't know how.
}
Use $n
(其中 n 是数字)引用捕获的子序列replaceFirst(...)。我假设您想用文字字符串替换第一组"number"第二组具有第一组的值。
Pattern p = Pattern.compile("(\\d)(.*)(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
// replace first number with "number" and second number with the first
// the added group ("(.*)" which is $2) captures unmodified text to include it in the result
String output = m.replaceFirst("number$2$1"); // "number example input 6"
}
考虑(\D+)
对于第二组而不是(.*)
. *
是一个贪婪的匹配器,并且首先会消耗最后一位数字。当匹配器实现最终结果时,它必须回溯(\d)
在匹配到最后一位数字之前,没有任何可匹配的内容。
Edit
多年后,这个问题仍然得到投票,评论和编辑(打破了答案)表明,人们对这个问题的含义仍然存在困惑。我已经修复了它,并添加了急需的示例输出。
对替换的编辑(有些人认为$2
不应该使用)实际上打破了答案。尽管持续的投票表明答案击中了关键点 - 使用$n
内的参考文献replaceFirst(...)
重用捕获的值 - 编辑丢失了这样一个事实:未修改的文本也需要被捕获,并在替换中使用,以便“仅组(并非所有模式)".
这个问题以及这个答案与迭代无关。这是故意的MRE.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)