为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2023-01-05 17:00:32

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

?
哔哔one

TA贡献1611条经验 获得超7个赞

在常规中:


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

println result

输出:


~>  groovy solution.groovy

Notification_Group_E3


~> 

在线试用!

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

//img1.sycdn.imooc.com/63b691cf0001c45902930093.jpg

正则解释:

  1. 我们使用groovy 斜杠字符串 /.../来定义正则表达式。这使转义更简单

  2. 我们首先匹配下划线_

  3. 然后我们使用预定义字符类匹配单个数字 (0-9) \d ,如 java Pattern 类的 javadoc 中所述

  4. 然后我们匹配一个+字符。我们必须用反斜杠转义它,\因为+在正则表达式中不转义意味着“一个或多个”(请参阅 javadocs 中的贪婪量词)。我们不想要一个或多个,我们只想要一个+角色。

  5. 然后,我们使用 parens 表达式创建一个正则表达式捕获组,如java 模式正则表达式的逻辑运算符部分中所述(.*)。我们这样做是为了不被锁定在以 结尾的输入字符串中E3。这样,输入字符串可以以任意字符串结尾,并且该模式仍然有效。这实质上是说“捕获一个组并包含任何字符(即.in regex)任意次数(即*in regex)”,这意味着“只捕获该行的其余部分,无论它是什么”。

  6. 最后我们替换为_$1,即只是下划线后跟捕获组捕获的任何内容。这$1是对“第一个捕获组”的“反向引用”,如 java Matcher javadocs中所述。


查看完整回答
反对 回复 2023-01-05
?
三国纷争

TA贡献1578条经验 获得超7个赞

在这里试试这个正则表达式(\d.*?\+) 演示

在爪哇中:

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

输出 :

Notification_Group_E3


查看完整回答
反对 回复 2023-01-05
?
Helenr

TA贡献1535条经验 获得超2个赞

简单的单线:


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

assert 'Notification_Group_E3' == res


查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信