Groovy:读取文件并返回每个匹配结果

时间:2012-02-22 15:40:36

标签: grep

我已经尝试了整个工作日来做这件事,但我还没有结果。所以,我不想做的是:

我有一个文本文件,糟糕的格式化,在这个文件中是像这样的文本的亨特:

2012-02-21 05:16:47,205 ERROR - No KPI mapping found for kpi 'stoerungbeheben_moduleaccess_triage_1', 

我会找到''之间的所有字符串,以便一个结果是:stoerungbeheben_moduleaccess_triage_1并将其写回另一个.txt文件

文字不同,有时相同。

我尝试使用filterLine并使用正则表达式进行模式处理,但它不起作用。

你能否给我一个暗示我怎么做?

亲切的问候

科林

1 个答案:

答案 0 :(得分:1)

以下groovy-script产生了所需的结果(虽然不写入文件,但我相信你可以轻松实现):

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

编辑: 对模式的解释将是长期的评论,因此将其添加到答案中:

维基百科文章有一个相当全面的正则表达式元字符表:http://en.wikipedia.org/wiki/Regular_expression#Examples IMO学习和理解正则表达式的最佳方法是针对各种任意字符串编写和执行正则表达式。

这种模式远非最优,但这里有一些解释[0-9] + - [^'] +'([^'] +)'[^ \ r \ n] * \ r?\ n?:

[0-9] + - => +符号表示匹配0到9之间的1个或多个数字。然后在连字符处停止(例如: 2012 - )。这是为了解决案件,如果没有换行或者它是最后一行。

[^'] +' =>匹配1个或多个不是撇号的字符并在撇号处停止(例如: -02-21 05:16:47,205错误 - 找不到kpi'的KPI映射。)

([^'] +)' =>匹配并捕获一个或多个非撇号的字符并停在撇号处(例如:stoerungbeheben_moduleaccess_triage_1',其中括号中的捕获部分为:stoerungbeheben_moduleaccess_triage_1)。

[^ \ r \ n] * =>匹配0个或更多不回车符(\ r)或换行符(\ n)的字符(例如:)。

\ r? =>匹配回车(如果存在)。

\ n =>匹配换行符(如果存在)。