Повторение регулярного выражения - PullRequest
1 голос
/ 28 марта 2019

У меня есть файл журнала, который я хочу проанализировать.Речь идет о получении значений в квадратных скобках и после «OK:» с помощью регулярных выражений.Проблема в том, что я не знаю, сколько раз встречается шаблон, и я не могу сказать, насколько длинен каждый код.Так что я могу передать только тот факт, что он окружен "[OK:" и "]".

До сих пор я пытался использовать этот шаблон здесь как регулярное выражение:

String ok_pattern = "(.*itId=<)(.{1,10})(>.*)(\\[OK:)(.{4,27})(].*)";
Pattern p_ok = Pattern.compile(ok_pattern);

String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";

Matcher m = p_ok.matcher(testString);
if(m.find()) {
    System.out.println(m.group(5));
}

Но это работает только в случае, когда есть только один "[OK: ...]".Я играл с использованием «*» и «+» после 5-й группы, но не смог добиться успеха.Как мне сделать это повторяющееся и при этом захватить все результаты?

Моя цель - извлечь комбинацию itemId и (char-) числа после «OK:» с помощью регулярных выражений.Поэтому в этом примере я хочу получить «1232» (ItemID) и «AZ1000105», «10000006», «F1000000007».

Я благодарен за любую помощь!

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Ваша базовая настройка верна, но ваш шаблон несколько отличается от идеального. Попробуйте использовать следующий шаблон регулярных выражений:

(?<=\[OK:)[^\]]+|(?<=itId=<)[^>]+

Это все еще использует взгляд назад, но он только утверждает, что предшествует [OK:. Затем он сопоставляет, даже не используя группу захвата, любое количество символов, которые не закрывающей квадратной скобки. Это соответствует контенту, который вы пытаетесь найти. Часть справа от чередования соответствует itId значениям.

String ok_pattern = "(?<=\\[OK:)[^\\]]+|(?<=itId=<)[^>]+";
Pattern p_ok = Pattern.compile(ok_pattern);
String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";

Matcher m = p_ok.matcher(testString);
while (m.find()) {
    System.out.println(m.group(0));
}

1232
AZ1000105
10000006
F1000000007
0 голосов
/ 28 марта 2019

Если вы хотите захватить цифры в itId=<1232> с последующим последующим захватом того, что следует после OK: в этом порядке, вы можете использовать якорь \G для подтверждения позиции в конце предыдущего матча .

Совпадение цифр itId в первой группе захвата и значения OK: во второй группе захвата:

itId=<(\d+)> Code < |\G(?!^)\[OK:([A-Z0-9]+)\]\s*

В Java:

String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([A-Z0-9]+)\\]\\s*";

Объяснение

  • itId=<(\d+)> Code < Совпадение первой части и захват 1 + цифр в группе 1
  • | или
  • \G(?!^) Конец предыдущего матча, а не в начале
  • \[OK:([A-Z0-9]+)\]\s* Соответствует [OK:, затем фиксирует ваше значение в группе 2 и соответствует ], за которым следуют 0+ пробельных символов

Regex demo | Java демо

Обратите внимание, что если вы хотите сопоставить больше, чем ([A-Z0-9]+), вы также можете использовать отрицательный класс символов, чтобы соответствовать не квадратным скобкам ([^]]+)

Например, вы можете проверить наличие групп:

String ok_pattern = "itId=<(\\d+)> Code < |\\G(?!^)\\[OK:([^]]+)\\]\\s*";
Pattern p_ok = Pattern.compile(ok_pattern);
String testString = "RANDOMTEXT itId=<1232> Code < [OK:AZ1000105]  [OK:10000006] [OK:F1000000007] > RANDOMTEXT";
Matcher m = p_ok.matcher(testString);

while(m.find()) {
    if (null != m.group(1)) {
        System.out.println("itId: " + m.group(1));  
    }
    if (null != m.group(2)) {
        System.out.println("Ok code: " + m.group(2));   
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...