Как анализировать текст с помощью регулярных выражений с использованием необязательных групп в качестве следующего предпочтительного синтаксиса Java - PullRequest
0 голосов
/ 24 мая 2018

Я хочу сделать регулярное выражение необязательной группой

, используя

https://regex101.com/

Текст выглядит следующим образом:

start to proceed task TaskId = id Account = xx@ttt.com Type = value1 Source = source_value SubSource = subSource_value

необязательные группы: Source, SubSource, все остальные - мандатории

Я пытался использовать следующее, но безуспешно использовать необязательные

Regex:

 start to proceed task\s*TaskId\s*=\s*(.*)\s*Account\s*=\s*(.*)\s*Type\s*=\s*(.*)\s*Source\s*=\s*(.*)\s*SubSource\s*=\s*(.*) 

OUTPUT:

Group 1.    31-36   `id `
Group 2.    46-57   `xx@ttt.com `
Group 3.    64-71   `value1 `
Group 4.    80-93   `source_value `
Group 5.    105-120 `subSource_value`

Но когда я удаляю из текста либо Source, либо SubSource, либо оба Source = source_value SubSource = subSource_value, вывод не отображается, моя цель: (зависит от того, что удалено)

Group 1.    31-36   `id `
Group 2.    46-57   `xx@ttt.com `
Group 3.    64-71   `value1 ` 

1 Ответ

0 голосов
/ 24 мая 2018

Вот рабочий сценарий и шаблон:

String line = "start to proceed task TaskId = id Account = xx@ttt.com Type = value1 Source = source_value SubSource = subSource_value";
String pattern = "start to proceed task\\s+TaskId\\s*=\\s*(.*?)\\s+Account\\s*=\\s*(.*?)\\s+Type\\s*=\\s*(.*?)(?:\\s+Source\\s*=\\s*(.*?))?\\s+(?:SubSource\\s*=\\s*(.*))?";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println("Group 1: " + m.group(1) );
    System.out.println("Group 2: " + m.group(2) );
    System.out.println("Group 3: " + m.group(3) );
    System.out.println("Group 4: " + m.group(4) );
    System.out.println("Group 5: " + m.group(5) );
}

Group 1: id
Group 2: xx@ttt.com
Group 3: value1
Group 4: source_value
Group 5: subSource_value

Демонстрация

Суть внесенных мною изменений включает создание захватагруппы ленивых (.*?).Кроме того, я сделал необязательным весь шаблон для источника и подисточника, например

(?:\s+Source\s*=\s*(.*?))?

Обратите внимание, что окружающая группа начинается с ?:, что говорит механизму регулярных выражений , а не для захватаэтот.Таким образом, может быть захвачена только ваша исходная группа (.*?), при условии, что она есть в тексте.

Чтобы заставить шаблон работать, мне нужно было предположить \s+ вместо \s* в определенных местах.

...