2017-03-01 136 views
1

我需要帮助编写正则表达式来从原始字符串中只删除部分匹配器。在正则表达式匹配后删除匹配器的一部分

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

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

期望的字符串中删除以毫秒为单位的一切。

我的正则表达式模式看起来是这样的:(:[0-5][0-9])\.[0-9]{1,3}

我需要这个正则表达式来确保我从一些时间字段只除去毫秒,而不是点之后到来的一切。但使用上面的正则表达式,我也删除了分钟部分。请建议和帮助。

+1

与'$ 1'替换。 –

+0

对不起,您可以详细说明一下吗? –

+0

是的,[见这里](http://ideone.com/oVX1mr)([regex demo](https://regex101.com/r/hzt059/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 demoregex demo

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

+1

这看起来不错,谢谢你的帮助。 –

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

+0

不,我需要确保我想删除任何时间,我通过确认“:”标签 –

1

使用$ 1和$ 2变量替换

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