繁体   English   中英

在正则表达式模式中匹配后删除匹配器的一部分

[英]remove part of matcher after the match in regex pattern

我需要帮助编写正则表达式模式,以从原始字符串中仅删除部分匹配器。

原始字符串: 2017-02-15T12:00:00.268+00:00

预期字符串: 2017-02-15T12:00:00+00:00

Expected String以毫秒为单位删除所有内容。

我的正则表达式模式如下所示: (:[0-5][0-9])\\.[0-9]{1,3}

我需要这个正则表达式,以确保我从一些时间字段中删除只有毫秒,而不是点后面的所有内容。 但是使用上面的正则表达式,我也删除了分钟部分。 请提出建议和帮助。

将您的模式更改为(?::[0-5][0-9])(\\.[0-9]{1,3}) ,在匹配器中运行find并删除group(1)找到的所有内容group(1)

反斜杠将强制匹配'。' char,而不是任何char,这是正则表达式中的点所代表的。

(?:定义一个非捕获组,因此不会在匹配器的group(...)考虑它。

并在您想要的内容周围添加括号将使其在匹配器中显示为组,在本例中为第一组。

一个很好的参考是模式javadoc: http//docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

您已在模式中定义了一个带有(...)捕获组 ,并且您希望在执行替换后将该部分字符串存在。 您只需要对此捕获中存储的值使用反向引用 它可以用$1来完成:

String s = "2017-02-15T12:00:00.268+00:00";
String res = s.replaceFirst("(:[0-5][0-9])\\.[0-9]{1,3}", "$1");
System.out.println(res); // => 2017-02-15T12:00:00+00:00

请参阅Java演示正则表达式演示

替换模式中的$1告诉正则表达式引擎它应该在匹配对象数据中查找ID为1的捕获组。 由于您只有一对未转义的括号(1个捕获组),因此该组的ID为1。

使用$ 1和$ 2变量进行替换

string.replaceAll("(.*)\\.\\d{1,3}(.*)","$1$2");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM