2016-11-23 90 views
-1

分割字符串我有一個像下面爪哇 - 由正則表達式

[timestamp] [ABC_DEF] this is message.

在Java中的字符串,我不得不拆分上面的字符串並獲得唯一this is message.

我試圖讓lastindexof拆分它]然後子字符串。但是,這不是一個適合我的用例的原因,我的消息可能包含],整個事情都會出錯。

所以,我想通過使用正則表達式。

在正則表達式我想匹配[timestamp] [ABC_DEF]。時間戳可以是任何東西,但它必須匹配[ABC_DEF]。只有這樣我才能得到我的信息。

任何建議書面正則表達式相同或任何如果你建議任何其他方法對我來說也很好。

謝謝。

+2

文字'[ABC_DEF]'的匹配似乎並不難,是嗎?你想嘗試一下嗎? – Henry

+0

是的,這就是你在你的問題中寫的。試一試,如果你不能自己完成,我們會幫助你。 – Thomas

+0

Re:'lastIndexOf':爲什麼不使用'indexOf'(兩次)? – Thomas

回答

1

只需String方法:

String filter = "[ABC_DEF]"; 
int filterIndex = line.indexOf(filter); 
if (filterIndex >= 0) { 
    return line.substring(filterIndex + filter.length()).trim(); 
} 

在這裏,你檢查字符串[ABC_DEF]是否包含在line如果是這樣,在該字符串中的位置。然後,通過將[ABC_DEF]的長度添加到發現的索引處,跳過該事件。該行的其餘部分是消息,並使用substring方法提取。最後,不必要的空格被截斷爲trim()


使用正則表達式:

String filter = "\\[ABC_DEF\\]"; // note the backslashs 
Pattern pattern = Pattern.compile("^\\[[^]]*\\]\\s+" + filter + "\\s*(.*)$"); 
Matcher matcher = pattern.match(line); 
if (matcher.matches()) { 
    return matcher.group(1).trim(); 
} 

首先,你編譯的正則表達式應該匹配line。 (當檢查多行時,Pattern定義應該只做一次。)由於[]是在正則表達式中具有特殊含義的字符,因此在將它們包括在正則表達式中時,我們必須使用反斜槓將它們轉義。行的消息部分在()之間捕獲,因此 - 如果表達式匹配 - 我們可以使用group方法輕鬆提取消息部分。與上述情況一樣,我們在消息的開頭和結尾用trim()刪除不必要的空白。