我需要帮助编写正则表达式模式,以便从原始字符串中仅删除部分匹配器。
原始字符串: 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 :(得分:1)
将您的模式更改为(?::[0-5][0-9])(\.[0-9]{1,3})
,在匹配器中运行find
并删除group(1)
中找到的所有内容。
反斜杠会强制匹配'。' char,而不是任何char,这是点在正则表达式中表示的。
(?:
定义了一个非捕获组,因此不会在匹配器的group(...)
中考虑它。
在你想要的地方添加一个括号会使它在匹配器中显示为组,在本例中是第一组。
一个很好的参考是模式javadoc:http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
答案 1 :(得分:1)
您已在模式中定义了capturing group (...)
,并且您希望在执行替换后将该部分字符串存在。您只需要使用backreference来存储此捕获中的值。可以使用$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 demo和regex demo。
替换模式中的$1
告诉正则表达式引擎它应该在匹配对象数据中查找ID为1的捕获组。由于您只有一对非转义括号(1个捕获组),因此该组的ID为1.
答案 2 :(得分:1)
使用$ 1和$ 2变量替换
string.replaceAll("(.*)\\.\\d{1,3}(.*)","$1$2");