java - Pattern.matcher(s).replaceAll ("$1$2$3") 仅将 $2 转换为小写

标签 java regex

我有一个像这样的字符串

final String text = "Some Text #AAAA some Other text .." (# with 4 uppercase letters)

Pattern patt = Patter.compile("(.*?)(#)([A-Z]{4})(.*?)");
patt.matcher(text ).replaceAll("$1$3$4")

仅删除文本中的#

我将 AAAA 小写,预期结果:

Some Text aaaa some Other text ..

这个结果怎么会是小写的,只针对四个AAAA

最佳答案

您必须自己执行appendReplacement循环,而不是直接使用replaceAll。我会使用更简单的正则表达式:

Pattern pattern = Pattern.compile("#([A-Z]{4})");
Matcher mat = pattern.matcher(text);
StringBuffer buf = new StringBuffer();
while(mat.find()) {
  mat.appendReplacement(buf, mat.group(1).toLowerCase());
}
mat.appendTail(buf);

通常,如果替换字符串可能包含 ,您必须注意 appendReplacement(和 replaceAll)并使用 Matcher.quoteReplacement $ 符号或反斜杠,但在本例中我们知道这种情况不会发生,因为第 1 组始终恰好是四个字母。

关于java - Pattern.matcher(s).replaceAll ("$1$2$3") 仅将 $2 转换为小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15244483/

相关文章:

JavaFX 无效属性

python - 百分号之间大写字母和下划线的正则表达式

javascript - 如何从 JSON 字符串中检索多个属性值

regex - sed : print all lines after match

c# - 如何检查字符串是否以特定字符串开头和结尾?

java - 停止 servlet 响应

java - 用于 Java 的高级 PDF 解析器

java - Camel Java DSL - header 中的 ENUM 路由 - 基于内容的路由器或动态路由器

java - 使用instanceof检查特定子类是一个好的设计实践吗?

c# - 使用 SendKeys 发送特殊字符