Java正则表达式:替换源字符串的部分

3
如果源字符串包含该模式,则替换它或将其删除。一种方法是像下面这样处理:
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(sourceString);
while(m.find()){
  String subStr = m.group().replaceAll('something',""); // remove the pattern sequence
  String strPart1 = sourceString.subString(0,m.start());
  String strPart2 = sourceString.subString(m.start()+1);
  String resultingStr = strPart1+subStr+strPart2;
  p.matcher(...);
}

但我想要像这样的东西。
Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(sourceString);
    while(m.find()){
      m.group.replaceAll(...);// change the group and it is source string is automatically updated    
}

这是可能的吗?
谢谢

'something' 无法编译,它不是一个字符而是一个字符串。 - Thomas
你的意思是想用其他内容替换字符串中的某个模式吗?你尝试过使用 String#replaceAll("pattern","replacement") 吗? - Thomas
2个回答

9

// 更改分组,其源字符串将自动更新

在Java中没有任何方法可以更改任何字符串,因此你所要求的是不可能的。

删除替换模式为字符串可以通过类似下面的调用来实现

someString = someString.replaceAll(toReplace, replacement);

为了"转换"匹配的子字符串,正如你的代码行所示。
m.group().replaceAll("something","");

最好的解决方案可能是使用

  • 一个StringBuffer存储结果
  • Matcher.appendReplacementMatcher.appendTail

示例:

String regex = "ipsum";
String sourceString = "lorem ipsum dolor sit";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(sourceString);
StringBuffer sb = new StringBuffer();

while (m.find()) {
    // For example: transform match to upper case
    String replacement = m.group().toUpperCase();
    m.appendReplacement(sb, replacement);
}

m.appendTail(sb);

sourceString = sb.toString();

System.out.println(sourceString); // "lorem IPSUM dolor sit"

2
假设您想替换所有出现的特定模式,请尝试以下方法:
String source = "aabbaabbaabbaa";
String result = source.replaceAll("aa", "xx");  //results in xxbbxxbbxxbbxx

删除该模式的方法如下:
String result = source.replaceAll("aa", ""); //results in bbbbbb

1
这是一个不错的方法,除非你需要转换匹配的子字符串。 - aioobe
@aioobe 没错,我一直在努力解释那个。那正是我想做的事情。将匹配的子字符串转换并以某种方式放回原始字符串。 - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接