java - 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;
}
}
解决方案
在常规中:
def result = "Notification_Group_4+E3".replaceFirst(/_\d\+(.*)/, '_$1')
println result
输出:
~> groovy solution.groovy
Notification_Group_E3
~>
正则表达式的可视化如下所示:
正则表达式解释:
- 我们使用groovy 斜线字符串
/.../
来定义正则表达式。这使得逃跑更简单 - 我们首先匹配下划线
_
\d
然后,我们使用java 模式类的 javadoc 中描述的预定义字符类匹配单个数字 (0-9) 。- 然后我们匹配一个
+
字符。我们必须用反斜杠转义它,\
因为+
在正则表达式中不转义意味着“一个或多个”(参见javadocs 中的贪婪量词)。我们不想要一个或多个,我们只想要一个+
角色。 - 然后,我们使用 parens 表达式创建一个正则表达式捕获组,如java Pattern 正则表达式的逻辑运算符部分中所述
(.*)
。我们这样做是为了不被锁定在以 结尾的输入字符串中E3
。这样,输入字符串可以以任意字符串结尾,并且该模式仍然有效。.
这实质上是说“捕获一个组并多次包含任何字符(即in 正则表达式)(即*
in 正则表达式)”,这意味着“只捕获该行的其余部分,无论它是什么”。 - 最后我们替换为
_$1
,即下划线后跟捕获组捕获的任何内容。这$1
是对“第一个捕获的组”的“反向引用”,例如 java Matcher javadocs中记录的。
推荐阅读
- php - Twinfield API OAuth2.0 getaccessToken php-twinfield/twinfield
- spleeter - sleeter 单独的视频文件到人声和伴奏,时间长度不同
- grails-4 - Groovy 3 对 Grails 4.0.x 的支持
- tizen - 更新 Big Sur 后为 Mac 安装 Tizen Studio 3.7/4.1 的问题
- python - 如何根据 x 刻度更改条形图中条形的颜色?(Matplotlib,Python)
- json - 在反应中将其从 csv 转换为 json 后,根据字段对 Json 数据进行分组
- c# - 使用 Linq 或任何其他方式优化我的 c# 函数
- java - 我想使用焦点计时器应用程序为用户创建一个统计页面
- jquery - 如何在 vue.js 方法中编写 jquery 脚本
- sql - BigQuery:将动态文件夹名称插入 EXPORT DATA 语句