有没有办法在java matcher正则表达式中只替换一个捕获的组?

时间:2016-07-05 00:11:05

标签: java regex

我需要在java中查找和替换子字符串,例如以'%'开头的变量名,使用正则表达式:

[\s,(](%variable)[\s,)$]

我想查找所有变量,存储它们的名称,然后将它们替换为某个占位符,例如%%。在java中找不到怎么可能,请帮忙。 Matcher#replaceAll替换整个正则表达式,但我需要替换第一组,而不是整个事件 这是我用于搜索的代码示例:

Matcher m=Pattern.compile(regex).matcher(str);
while(m.find())
{
   System.println(m.group(1));
}

UPD: 解决方案是将捕获设置为整个正则表达式:

([\s,(])(%variable)([\s,)$])

并使用replaceAll(“$ 1”+替换+“$ 3”)然后

1 个答案:

答案 0 :(得分:4)

您可以保留一些正则表达式组,并替换字符串中出现的其他组。如果我们假设你的正则表达式是:[\\s,\\(](%variable)[\\s,$],那么你可以使用java.lang.String的{​​{3}}方法。 首先需要以saparate组的形式设置正则表达式

例如:([\\s,\\(])(%variable)([\\s,$]), 所以你有

第一组是:[\\s,\\(]

第二组是%variable

第三组是[\\s,$],现在你可以设置你的小组的参考了  将替换正则表达式中发现的每个出现的最终值,例如,如果我们要用字符串'myNewVal'替换第二个组,则代码将为:

String myRegex = "([\\s,\\(])(%variable)([\\s,$])";
String replacedValue = originalValue.replaceAll(myRegex,"$1myNewVal$3");

$1$3引用第一组和第三组,我们将它们保存在replaceValue中。

如果你想删除第二组,你可以试试这个:

String myRegex = "([\\s,\\(])(%variable)([\\s,$])";
String replacedValue = originalValue.replaceAll(myRegex,"$1$3");