2012-10-25 24 views
0

你好我試圖將一個字符串阻止圖形正則表達式一次或多次JAVA

匹配,這是可能的字符串

signal CS, NS, dl: stateType := writeOrRead0; 
signal CS, pS : stateType := writeOrRead0; 
signal dS : stateType := writeOrRead0; 

我只關心與圖案至於第一個冒號。

但信號的數目定義可以是多於一個它可能是三個或四個甚至 這是正則表達式我有

^signal\\s*(\\w+),*\\s*(\\w+)\\s*: 

它會拿起後兩個信號,而是與用於第二一個它拿起CS和PS和,但d和S在接下來的信號時,我使用

matcher.group() 

拿出seperately

任何人都可以摹給我一個表達式,可以提取所有的信號名稱,不管是否有兩個或三個以上的信號?

+0

供參考:這是一個很好的地方玩/測試正則表達式:http://www.regexplanet.com/advanced/java/index.html –

回答

5

如果你想爲每個信號名稱設置一個組,這是不可能的(除非你有一個信號數量的上限,那麼你可以寫出整個事情,但它會非常難看)。

所以你必須住在一個包含名稱,逗號分隔的組中。然後,您可以對其進行後處理,以獲取真實的信號名稱。

這將使類似

^signal\s+((?:\w+(?:,\s*)?)*)\s*: 

(請注意,我也沒有逃脫它爲Java String)

組1是你的名字。

+0

我太慢了......我的正則表達式是「^ signal(\\ s * \\ w +,?)+ \\ s *:」 - 然後修剪並在逗號分割,並修剪結果。 – PhiLho

4

我會做的下一件事:

1-獲取信號的完整GROUP:CS,NS,DL(例如)

2-解析它們

你舉的例子:

1- ^signal\\s((\\w*)(?:,\\s)?)+

2 - 現在你有一個像「CS,NS,DL」現在的一個簡單的拆分組中的字符串「」你可以讓他們在一個數組。

0

你可以使用這個表達式:

^信號\ S([\ W \ S] *(= :))

開始與信號後面加一個空格,捕捉?一個單詞出現零個或多個,後跟逗號和空格。在':'結束捕獲,但不包括在比賽中。

爲了不包括信號本身在比賽中可以使用反向預搜索如下:

^\ S([\ W,\ S] *((< =信號?)?= :))