以下常规脚本生成所需的结果(虽然不写入文件,但我相信你可以很容易地做到这一点):
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