首页 > 解决方案 > Java/Groovy - 字符串:替换匹配的正则表达式上的字符

问题描述

我在创建将从字符串示例中获得的匹配正则表达式时遇到问题: NotificationGroup_n+En 其中 n 是 1-4 的数字,当我匹配范围内的所需数字时,我将用该特定数字替换或删除它。

处理前的字符串:NotificationGroup_4+E3

处理后的字符串:NotificationGroup_E3

我删除了 n(1-4 中的数字)并将 _E 保留为数字

我的问题是如何在 string.replace 函数中编写正则表达式来匹配数字而不是加号,并且只省略带有 _En 的字符串

def String string = "Notification_Group_4+E3";
    println(removeChar(string));
}
public static def removeChar(String string) { 
    if ((string.contains("1+"))||(string.contains("2+")||(string.contains("3+"))||(string.contains("4+")))) {
        def stringReplaced = string.replace('4+', "");
        return stringReplaced;
    }
}

标签: javagroovyscripting

解决方案


在常规中:

def result = "Notification_Group_4+E3".replaceFirst(/_\d\+(.*)/, '_$1')
println result

输出:

~>  groovy solution.groovy
Notification_Group_E3

~> 

在线尝试!

正则表达式的可视化如下所示:

正则表达式可视化

正则表达式解释:

  1. 我们使用groovy 斜线字符串 /.../来定义正则表达式。这使得逃跑更简单
  2. 我们首先匹配下划线_
  3. \d 然后,我们使用java 模式类的 javadoc 中描述的预定义字符类匹配单个数字 (0-9) 。
  4. 然后我们匹配一个+字符。我们必须用反斜杠转义它,\因为+在正则表达式中不转义意味着“一个或多个”(参见javadocs 中的贪婪量词)。我们不想要一个或多个,我们只想要一个+角色。
  5. 然后,我们使用 parens 表达式创建一个正则表达式捕获组,如java Pattern 正则表达式的逻辑运算符部分中所述(.*)。我们这样做是为了不被锁定在以 结尾的输入字符串中E3。这样,输入字符串可以以任意字符串结尾,并且该模式仍然有效。.这实质上是说“捕获一个组并多次包含任何字符(即in 正则表达式)(即*in 正则表达式)”,这意味着“只捕获该行的其余部分,无论它是什么”。
  6. 最后我们替换为_$1,即下划线后跟捕获组捕获的任何内容。这$1是对“第一个捕获的组”的“反向引用”,例如 java Matcher javadocs中记录的。

推荐阅读