2015-04-21 106 views
1

我正在嘗試開發一個與系統日誌消息相匹配的Java程序。系統日誌消息不工作的Java正則表達式

的模式是這樣的:

"%FACILITY-[SUBFACILITY-]SEVERITY-MNEMONIC: description" 

起初我這個正則表達式,它的工作的一些消息:

(%[a-zA-Z_-]+-[0-6]-[a-zA-Z_-]+[^\r\t\n]+) 

現在我需要之前,只有部分匹配「:」 (即%FACILITY- [SUBFACILITY-]嚴重-助記符),所以我做了以下內容,不工作:

(%[a-zA-Z_-]+-[0-6]-[a-zA-Z_-]+) 

我發現了一些在線測試頁面,令人驚訝的是第一個字符串匹配,但不是第二個(這是Java代碼)。

http://www.regexr.com/ - >匹配

http://www.regexplanet.com/advanced/java/index.html - >不匹配

這是我想匹配的字符串:做RCC檢查時可能出現

%HA-REDCON-4-FAILOVER_REQUEST[0x767443be74] Record Reboot History, reboot cause = 0x4000004, descr = Cause: Initiating switch-over. 

%ROUTING-FIB-3-ASSERT錯誤信息。

任何人都有這個想法嗎?我錯過了什麼?

在此先感謝。

+0

要匹配':'之前的所有內容,請使用'^ [^:] +'正則表達式。請參閱https://regex101.com/r/kW5uY4/1(它也適用於Java)。只是不要使用「匹配」,因爲它會檢查整個字符串捕獲。或者,使用帶'matches'的捕獲組:'([^:] +):。*'。 –

+0

如果@stribizhev的回答很有幫助,請將其標記爲已接受 – rpax

回答

1

要匹配:之前的所有內容,請使用^[^:]+正則表達式。

請參閱demo(它也適用於Java,find())。

Java中的matches()只需匹配整個字符串,這就是爲什麼regexplanet.com表示沒有匹配(但find()顯示成功)。

如果要使用matches(),則需要將正則表達式擴展爲字符串結尾,並且只抓取第一個捕獲組:([^:]+):.*

這是鏈接到sample program showing how to capture multiple matches

String str = "%ROUTING-FIB-3-ASSERT more words here\n%HA-REDCON-4-FAILOVER_REQUEST[0x767443be74] Record Reboot History, reboot cause = 0x4000004, descr = Cause: Initiating switch-over."; 
String rx = "(?i)(%[a-z_-]+-[0-6]-[a-z_-]+)"; 
Pattern ptrn = Pattern.compile(rx); 
Matcher m = ptrn.matcher(str); 
while (m.find()) { 
    System.out.println(m.group(0)); 
} 
+0

感謝您的回覆。我實際上可以爲那些冒號的病例做到這一點。但是,現在我需要匹配沒有冒號的消息,例如:執行RCC檢查時可能會發生%ROUTING-FIB-3-ASSERT錯誤消息嗎?是否知道哪個正則表達式可以匹配? –

+0

這些都是要求,還是會有更多?那麼,對於那些,你當然可以使用你自己的正則表達式'(?i)(%[a-z _-] + - [0-6] - [a-z _-] +)',但是你最好使用它用'Matcher.find()'方法。你想讓我提供示例Java代碼嗎?以下是一個示例程序:http://www.tutorialspoint.com/compile_java_online.php?PID=0Bw_CjBb95KQMV1puOTctN2htY1U –

+0

非常感謝:-) –