Как получить все комбинации групп захвата из регулярного выражения?
Учитывая строку Max Michael van Mustermann
Я хочу сгенерировать пары (Max)(Michael van Mustermann)
, (Max Michael)(van Mustermann)
и (Max Michael van)(Mustermann)
.
Это должен быть выполнимым по шаблону ^(.+) (.+)$
(где пробел - это разделительный символ). Однако это не работает так, как задумано, поскольку первая группа захвата жадно захватывает Max Michael van
, оставляет Mustermann
второй группе захвата и завершает оценку, поскольку вся строка была сопоставлена.
Я пытался использовать решения для перекрывающихся матчей ((?=<regex>)
), но это не дало желаемых результатов (поглощение одного символа за другим с фронта, но по-прежнему жадным, как и раньше).
Я пытался сделать первую группу захвата ленивой, но это только решает проблему. Никакая комбинация лени и / или жадности не приведет к совпадению (Max Michael)(van Mustermann)
.
Насколько я понимаю, регулярное выражение пытается вписать всю строку в первую .+
, не может соответствовать второй .+
и продолжает высвобождать символы из первого .+
для сопоставления со вторым .+
до совпадения (в моем случае с последним пробелом). Я хочу, чтобы механизм регулярных выражений продолжал выпускать символы до тех пор, пока в первых .+
.
Моя настоящая проблема:
У меня есть список имена в виде строк. Я не знаю, где их разделить по имени и фамилии. Однако у меня есть другой список с теми же именами, но с обратными именами и фамилиями.
Моя идея состоит в том, чтобы найти все комбинации групп захвата в первом списке, изменить их порядок и сопоставить их против второго списка.
# First list
Max van Mustermann
Miriam Musterfrau
Alice Bobina Charlston
# Second list
van Mustermann Max (van is part of last-name)
Musterfrau Miriam
Charlston Alice Bobina (Bobina is part of first-name)
Какой-то примерно желаемый код:
String first = "Max van Mustermann";
String second = "van Mustermann Max";
Pattern pattern = Pattern.compile("^(.+) (.+)$");
Matcher matcher = pattern.matcher(first);
while (matcher.find()) { // This is obviously not correct, it will only find the first match
String swapped = matcher.group(2) + " " + matcher.group(1);
if(second.equals(swapped)){
// Success!
}
}
Это можно решить без регулярных выражений. Именно крючок заставил меня исследовать проблему.