2017-03-01 69 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");