2016-08-12 61 views
0

我想創建一個正則表達式來在第二個點之後分割一個字符串。試圖推廣正則表達式

例:字符串"AF23.2016.12"應該分頭{"AF23.2016", ".12"}

截至到目前爲止,我得到了如下的正則表達式我駁:

"(?<=(\\p{Alnum}+)\\.(\\p{Alnum}{4}))(?=\\.)" 

這此字符串工作正常,但我必須指定的長度第二部分(\\p{Alnum}{4})但它是變體。

我嘗試過使用+而不是{4},但如果這樣做,拆分不起作用。結果:"AF23.2016.12"

我怎樣才能將第二部分概括爲任意長度?

+1

爲什麼不能是這樣的:「[^] * \。[^。] *(\ .. *)「還是有更多的條件? –

+1

第二個點也總是最後一個點?如果是,'「(?= \\。[^。] * $)」'會起作用。 –

+0

@AlanMoore真棒,我沒有注意到我可以用這種方式。 – Dener

回答

2

如果試圖"(?<=\\.(\\p{Alnum}+))(?=\\.)"你得到一個異常說

向後看組沒有明顯的最大長度

(我不知道爲什麼你沒有得到與消息兩個+;也許你應該。)但它給出了一個想法,你可以做些什麼來使其工作:限制後視羣的長度。而不是無限制+使用類似{1,1000}的東西。這個工作對我來說:

"(?<=(\\p{Alnum}{1,1000})\\.(\\p{Alnum}{1,1000}))(?=\\.)" 

(空間和或時間要求可能從選擇一個更小的重複極限受益我沒有檢查這一點。)

+0

哇。 Java的正則表達式實際上支持可變長度lookbehinds?這是非常罕見的。 – usr2564301

+0

我想現在我明白了爲什麼不使用無限制的'+'。謝謝。 '{1,1000}'是一個很好的解決方案。我會用100只大聲笑 – Dener

0

此正則表達式似乎做你想要什麼:

^([A-F0-9]+?\.[A-F0-9]+?)\.([A-F0-9]+)$ 

或與您的\\p{Alnum}語法:

^(\\p{Alnum}+?\.\\p{Alnum}+?)\.(\\p{Alnum}+)$ 

我不知道你正在使用的背景下,這個正則表達式。這裏的結果將把第一部分和第二部分放入\1,\2

+0

如果第一個字符已經是點,這將不起作用。不知道如果這是一個問題,但。 – AlexR

1

而是分裂最好是用捕獲的人羣使用匹配:

(\w+\.\w+)(\.\w+) 

RegEx Demo

在Java:

Pattern p = Pattern.compile("(\\w+\\.\\w+)(\\.\\w+)"); 

然後使用Matcher API來獲取兩種捕捉組。

+0

我需要拆分,不匹配 – Dener