以下常規腳本生成所需的結果(雖然不寫入文件,但我相信你可以很容易地做到這一點):
def regex = "[0-9]+-[^']+'([^']+)'[^\r\n]*\r?\n?"
def source = """
2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'stoerungbeh_¤eben_moduleaccess_triage_1',
2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'otherbeheben_üü'
2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'stoerungbeheben_moduleaccess_triage_1',
2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'thirdhbeheben_äÄ_moduleaccess_triage_1'
2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'stoerungbeheben_mo&%duleaccess_triage_1',
"""
java.util.regex.Pattern p = java.util.regex.Pattern.compile(regex)
java.util.regex.Matcher m = p.matcher(source)
while(m.find()) {
println(m.group(1))
}
產量:
stoerungbeh_¤eben_moduleaccess_triage_1
otherbeheben_üü
stoerungbeheben_moduleaccess_triage_1
thirdhbeheben_äÄ_moduleaccess_triage_1
stoerungbeheben_mo&%duleaccess_triage_1
編輯: ex圖案夷將是長期的註釋,以便將其添加到答案:
維基百科的文章有正則表達式元字符一個相當全面的表:http://en.wikipedia.org/wiki/Regular_expression#Examples IMO學習和理解正則表達式的最好方式是寫和針對各種任意字符串執行正則表達式的zounds。
該模式遠不是最優的,但這裏是對[0-9] + - [^'] +'([^'] +)'[^ \ r \ n] * \ r?\ n的一些解釋。 :
[0-9] + - => +號表示匹配從0到9 1個或多個數字。然後停止在連字符(例如:2012-)。這是爲了解決這個問題,如果沒有換行符或者它是最後一行。
[^ '] +' =>匹配1個或多個字符未撇號和在撇號停止(例如:-02-21 05:16:47205 ERROR - 未發現KPI KPI映射' )。
([^「] +)」 =>匹配和捕捉1個或多個字符未撇號和在撇號停止(例如:stoerungbeheben_moduleaccess_triage_1' ,其中從在括號內的捕獲部分是:stoerungbeheben_moduleaccess_triage_1)。
[^ \ r \ n]的* =>匹配0或多個字符不屬於回車(\ R)或換行符(\ n)(例如:,)。
\ r? =>匹配回車如果存在。
\ n? =>匹配換行符(如果存在)。
哇,非常感謝。完美的作品。該文件已經以獨特的命中方式生成。 我從來沒有找到這個正則表達式模式:)你能否推薦我一個網站,有一個很好的解釋這個正則表達式,因爲我會理解它。 親切的問候,科林 – CollinG 2012-02-23 09:34:49
請參閱編輯答案的解釋。不幸的是,我不能推薦任何關於正則表達式的「銀彈」網站。 – heikkim 2012-02-23 11:42:19