3 回答
TA贡献1854条经验 获得超8个赞
在常规中:
def result = "Notification_Group_4+E3".replaceFirst(/_\d\+(.*)/, '_$1')
println result
输出:
~> groovy solution.groovy
Notification_Group_E3
~>
正则表达式的可视化如下所示:
正则解释:
我们使用groovy 斜杠字符串
/.../
来定义正则表达式。这使转义更简单我们首先匹配下划线
_
然后我们使用预定义字符类匹配单个数字 (0-9)
\d
,如 java Pattern 类的 javadoc 中所述。然后我们匹配一个
+
字符。我们必须用反斜杠转义它,\
因为+
在正则表达式中不转义意味着“一个或多个”(请参阅 javadocs 中的贪婪量词)。我们不想要一个或多个,我们只想要一个+
角色。然后,我们使用 parens 表达式创建一个正则表达式捕获组,如java 模式正则表达式的逻辑运算符部分中所述
(.*)
。我们这样做是为了不被锁定在以 结尾的输入字符串中E3
。这样,输入字符串可以以任意字符串结尾,并且该模式仍然有效。这实质上是说“捕获一个组并包含任何字符(即.
in regex)任意次数(即*
in regex)”,这意味着“只捕获该行的其余部分,无论它是什么”。最后我们替换为
_$1
,即只是下划线后跟捕获组捕获的任何内容。这$1
是对“第一个捕获组”的“反向引用”,如 java Matcher javadocs中所述。
TA贡献1780条经验 获得超3个赞
简单的单线:
String res = 'Notification_Group_4+E3'.replaceAll( /_\d+\+/, '_' )
assert 'Notification_Group_E3' == res
添加回答
举报