2012-10-31 32 views
1

我有一個字符串,如下所示。使用java的正則表達式

$Alarm:com.Alarm(a == 123 || (count == 12345 || (time matches "24" && pqr =="1"))) 
$Event:com.Event(b == 123 || (co == 12345 || (time matches "204" && pqr =="22"))) 

每當我遇到上述字符串我需要生成以下string.I意味着我需要追加字符串"from AlarmStream"爲子$Alarm:com.Alarm(...)"from EventStream"爲子串$Event:com.Event(...)如下。

$Alarm:com.Alarm(a == 123 || (count == 12345 || (time matches "24" && pqr =="1"))) from AlarmStream 

$Event:com.Event(b == 123 || (co == 12345 || (time matches "204" && pqr =="22"))) from EventStream 

我目前在java中使用以下模式獲得相同的結果。

Pattern alarmPattern = Pattern.compile(".*?\\.Alarm\\(([^\\(]*?|\\([^\\)]*?\\))*\\)"); 
Pattern eventPattern = Pattern.compile(".*?\\.Event\\(([^\\(]*?|\\([^\\)]*?\\))*\\)"); 

但我沒有得到正確的輸出。

請給我提供一些指針,以實現正確的輸出。正則表達式應該只考慮最後一個括號,這裏左右括號對的數量並不是固定的。它可以增加或減少。因此,邏輯應該適用於任意數量的左右括號對。

+0

你是否保存報警和事件對象文件?請參見java.util.Properties(用於可讀文本屬性)和java.io.Serializable。還有用於XML序列化的JAXB。 – ignis

回答

2

爲什麼你需要RegEx這裏。我認爲,即使這種類型的FO代碼應工作對你罰款:

if (str.startsWith("$Alarm:com.Alarm")) 
    str = str + " from AlarmStream"; 
else if (str.startsWith("$Event:com.Event")) 
    str = str + " from EventStream"; 
+0

這裏的問題是,字符串不僅包含這兩個字符串($ Alarm:com.Alarm(a == 123 ||(count == 12345 ||(time matches「24」&& pqr ==「1」)) )從AlarmStream.these這兩個字符串是實際傳入字符串的子字符串,但確切位置未知。 $事件:com.Event(b == 123 ||(co == 12345 ||(時間匹配「204 「&& pqr ==」22「)))from EventStream) – user1668653

+0

在這種情況下,您可以使用[String#contains](http://docs.oracle.com/javase/1.5.0/docs/api/java/lang /String.html#contains(java.lang.CharSequence))而不是'startsWith'。 – anubhava

0

類似以前的解決方案:

str += str.startsWith("$Alarm:com.Alarm")?" from AlarmStream":str.startsWith("$Event:com.Event")?" from EventStream":""; 
+0

它不起作用的原因 - >這裏的問題是字符串不僅包含這兩個字符串($ Alarm:com.Alarm(a == 123 ||(count == 12345 ||(time matches)24 「&& pqr ==」1「)))從AlarmStream.these這兩個字符串是實際傳入的字符串的子字符串,但確切的位置是未知的$事件:com.Event(b == 123 ||(co == 12345 ||(時間匹配「204」&& pqr ==「22」)))來自EventStream) – user1668653