2011-09-15 70 views
0

你能告訴我的正則表達式從下面拍攝行類名:大廈正則表達式表達

[2011-09-14 20:43:31:943 GMT][E08C17F94E8.http-8080-Processor21]com.abc.MyClass] INFO login successful 

在這裏,我需要捕捉MyClass

到目前爲止,我可以用(?i)^(?:[^\[]*\[){3}

捕捉到整個com.abc.MyClass但我無法捕捉MyClass

任何幫助,非常感謝。

謝謝!

+0

您使用哪種語言? – Chriszuma

+2

最好的正則表達式是'/(MyClass)/'。如果你需要更通用的東西,儘量更通用。 – sidyll

+0

'。+ abc \。([\ w] +)。*'會起作用...更多詳情? – Andy

回答

0

如果您可以假設永遠不會有那最後一個後面的括號內,這是很簡單的:

(\w+)\][^]]$ 

此捕獲所有直接在字符串中的最後]前的字母數字字符的。

注意:您不需要執行[^\]],因爲PCRE的規範說如果]是字符列表中的第一個,則不需要轉義它。

編輯:既然你不能假設沒有括號,這裏是另外一個,將工作:

\[.+?\]\[.+?\].*?(\w+)\] 

該扔掉了前兩個集支架,和前抓住的字母數字字符的最大塊下一個括號。在.+??使它成爲非貪婪倍頻,所以它會匹配儘可能少的字符可能,這使得這個正則表達式非常簡單和高效。

沒有任何反對daxnitro,但那正則表達式讓我想放棄編程。

+0

有可能有括號,我不能假設這... – Mike

+0

感謝您提供關於[^ \]]的提示。使它不那麼嚴重,但你的看起來仍然更清潔。 : - / – daxnitro

1

如果有可能爲年底有括號(即說:「登錄成功」的部分),你可以使用這個:

^\[[^]]*\]\[[^]]*\][^]]*\.([^]]+)\].*$ 

讓我們看看我能不能打破這一點...

^\[[^]]*\]第一托架,所有以下非「]」字符,並且右括號匹配。這是[2011-09-14 20:43:31:943 GMT]的一部分。

\[[^]]*\]然後匹配的開口支架,所有以下非「]」字符,並且另一個右括號。這是[E08C17F94E8.http-8080-Processor21]部分。

[^]]*\.([^]]+)然後匹配的所有非「]」字符,後跟一個句點,接着是一個或多個非「]」字符。這是com.abc.MyClass部分。 MyClass部分與括號中的部分匹配。

\].*$匹配的右括號和字符串的其餘部分。這是] INFO login successful部分。

因此,如果在您的示例中將^\[[^]]*\]\[[^]]*\][^]]*\.([^]]+)\].*$替換爲$1,則只剩MyClass

+0

文本可以是任何東西,不只是「登錄成功」..此外,MyClass可以是任何類,因爲它的日誌文件...這會工作嗎? – Mike

+0

你能解釋一下嗎? – Mike

+0

它應該。當我測試它時工作。您可能想要將^和$標記添加到它(儘管...)(我現在要編輯它) – daxnitro