Groovy: прочитайте файл и получите каждый соответствующий результат обратно - PullRequest
1 голос
/ 22 февраля 2012

Я пытался сделать это весь рабочий день, но пока не получил результата.Итак, что я не хочу делать, это:

У меня есть текстовый файл, плохо отформатированный, в этом файле сотни таких текстов:

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

Я найду все строкимежду ' и ' так, чтобы один результат был: stoerungbeheben_moduleaccess_triage_1 и записать его обратно в другой .txt файл

Текст другой, иногда такой же.

I 'мы пробовали с filterLine и паттерном с регулярным выражением, но он не работает.

Не могли бы вы дать мне подсказку, как я могу это сделать?

С уважением

Коллин

1 Ответ

1 голос
/ 22 февраля 2012

Следующий groovy-скрипт выдает желаемый результат (хотя и не записывает в файл, но я полагаю, что вы легко можете добиться этого):

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

EDIT: Объяснение модели было бы длинным комментарием, поэтому добавил его к ответу:

Статья в Википедии содержит довольно полную таблицу метасимволов регулярных выражений: http://en.wikipedia.org/wiki/Regular_expression#Examples IMO лучший способ выучить и понять регулярные выражения - это написать и выполнить зоны регулярных выражений для различных произвольных строк.

Шаблон далек от оптимального, но вот некоторые объяснения для [0-9] + - [^ '] +' ([^ '] +)' [^ \ r \ n] * \ r? \ N ?:

[0-9] + - => + знак означает совпадение 1 или более чисел от 0 до 9. Затем остановитесь на дефисе (пример: 2012- ). Это для решения случая, если нет новой строки или это последняя строка.

[^ '] +' => соответствует 1 или более символам, которые не являются апострофами, и останавливаются на апострофе (пример: -02-21 05: 16: 47,205 ОШИБКА - нет сопоставления KPI найдено для kpi ').

([^ '] +)' => сопоставить и захватить 1 или более символов, не являющихся апострофами, и остановиться на апострофе (пример: stoerungbeheben_moduleaccess_triage_1 'где из захваченной части в скобках есть: stoerungbeheben_moduleaccess_triage_1) .

[^ \ r \ n] * => соответствует 0 или более символам, которые не являются символом возврата каретки (\ r) или новой строки (\ n) (пример: , ) .

\ r? => сопоставить возврат каретки, если он существует.

\ n? => соответствует символу новой строки, если он существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...