【问题标题】:Is there a way to replace only one captured group in java matcher regex?有没有办法在 java matcher regex 中只替换一个捕获的组?
【发布时间】:2016-11-06 17:01:16
【问题描述】:

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

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

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

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

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

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

然后使用 replaceAll("$1"+replacement+"$3")

【问题讨论】:

  • 你试过replaceFirst的方法吗?
  • @developer033 这对捕获组没有任何作用。这只是替换正则表达式的第一个匹配项,而不是替换所有匹配项。
  • 嗯,他说“我只需要替换第一组,而不是整个事件。”
  • First 表示“1”,而不是“0”;)我需要用 Java 术语替换“group(1)”
  • @developer033 “第一组”是指匹配在其正则表达式中括号内的部分。和第一场比赛不一样。

标签: java regex


【解决方案1】:

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

例如:([\\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");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2021-05-31
  • 2013-08-21
  • 1970-01-01
  • 2019-11-06
相关资源
最近更新 更多