Java / Groovy-字符串:替换匹配的正则表达式上的字符

时间:2019-06-05 06:18:29

标签: java groovy scripting

我在创建从字符串示例获取的匹配正则表达式时遇到问题: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;
    }
}

3 个答案:

答案 0 :(得分:0)

尝试此正则表达式(\d.*?\+) here demo

在Java中:

String string = "Notification_Group_4+E3";
System.out.print(string.replaceAll("\\d.*?\\+", ""));

输出:

Notification_Group_E3

答案 1 :(得分:0)

常规:

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

输出:

~>  groovy solution.groovy
Notification_Group_E3

~> 

api documentation

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

Try it online!

正则表达式说明:

  1. 我们使用regex visualization /.../定义正则表达式。这使转义变得更简单
  2. 我们首先在下划线_上进行匹配
  3. 然后,我们使用预定义的字符类\d groovy slashy strings匹配一位数字(0-9)。
  4. 然后我们匹配一个+字符。我们必须用反斜杠\对此进行转义,因为+而不在正则表达式中转义表示“一个或多个”(请参阅​​javadocs中的as described in the javadoc for the java Pattern class)。我们不需要一个或多个,我们只需要一个+字符。
  5. 然后我们使用括号表达式(.*)创建一个greedy quantifiers中所述的正则表达式捕获组。这样做是为了避免被锁定在以E3结尾的输入字符串中。这样,输入字符串可以以任意字符串结尾,并且模式仍将起作用。这实际上表示“捕获组并在任意次数(正则表达式中的.中包含任何字符(即正则表达式中的*)”表示翻译为“只捕获其余的字符线,无论它是什么。”
  6. 最后,我们将其替换为_$1,即仅在下划线之后加上捕获组捕获的所有内容。 $1是对“第一个捕获组”的“反向引用”,例如在Java logical operators part of the java Pattern regex中记录的。

答案 2 :(得分:0)

简单的一线:

String res = 'Notification_Group_4+E3'.replaceAll( /_\d+\+/, '_' )
assert 'Notification_Group_E3' == res