Я пытаюсь написать регулярное выражение для захвата строки имени перед запятой, за исключением младшего | Sr. и римские цифры - PullRequest
1 голос
/ 18 октября 2019

Примеры имен, которые я здесь пробую, приведены здесь

O'Kefe,Shiley
Folenza,Mitchel V
Briscoe Jr.,Sanford Ray
Andade-Alarenga,Blnca 
De La Cru,Feando
Carone,Letca Jo
O'Conor,Mole K
Daeron III,Lawence P
Randall,Jason L
Esquel Mendez,Mara D
Dinle III,Jams E
Coras Sr.,Cleybr E
Hsieh-Krnk,Caolyn E
Graves II,Theodore R

Я пытаюсь захватить все до запятой, кроме римских чисел и суффикса Sr. | Jr.. Поэтому, если имя похоже на Andade-Alarenga,Blnca, я хочу захватить Andade-Alarenga, но если имя Briscoe Jr.,Sanford Ray, я просто хочу Briscoe.

, код, который я пробовал, находится здесь

^((?:(?![JjSs][rR]\.|\b(?:[IV]+))[^,]))

также этот - ^ (?! \ W + \ A [jr | sr | Jr | Sr]. *) \ W + |\ w + \ w + | '\ w + | - \ w + $

[Regex101 мой код с примерами] [1]

https://regex101.com/r/jX5cK6/2

Ответы [ 4 ]

1 голос
/ 18 октября 2019

Из-за вашего теста на Regex101 я предполагаю, что ваш движок регулярных выражений поддерживает положительные просмотры (например, это верно для PCRE, Javascript или Python)

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

^[\w'\- ]+?(?= ?(?:\b(?:[IVXCMD]*|\w+\.)),)

Часть, соответствующая названию, настолько проста, насколько это возможно:

^[\w'\- ]+?

Все, что он делает, это соответствует любому из символов в списке. последний ? должен сделать его ленивым : Таким образом, движок будет соответствовать только минимальному количеству символов.

Важная часть этого:

(?= ?(?:\b(?:[IVXCMD]*|\w+\.)),)

Он разделен на две части трубой (этот символ: |). Первая часть соответствует римским цифрам (или ничего), а вторая часть соответствует заголовкам (в основном, все, что заканчивается на .). Наконец, нам нужно сопоставить запятую из-за вашего требования.

Вот это на Regex101

1 голос
/ 18 октября 2019

Вы не указали язык, поэтому я использовал регулярное выражение в методе replaceAll() String Java.

      String[] names = {
            "O'Kefe,Shiley", "Folenza,Mitchel V", "Briscoe Jr.,Sanford Ray",
            "Andade-Alarenga,Blnca", "De La Cru,Feando", "Carone,Letca Jo",
            "O'Conor,Mole K", "Daeron III,Lawence P", "Randall,Jason L",
            "Esquel Mendez,Mara D", "Dinle III,Jams E", "Coras Sr.,Cleybr E",
            "Hsieh-Krnk,Caolyn E", "Graves II,Theodore R"

      };

      for (String name : names) {
         System.out.println(name + " -> "
               + name.replaceAll("(I{1,3},|((Sr|Jr)\\.,)|,).*", ""));
      }

Вот решение Python, использующее re.sub


    import re
    names = ["O'Kefe,Shiley", "Folenza,Mitchel V", "Briscoe Jr.,Sanford Ray",
                "Andade-Alarenga,Blnca", "De La Cru,Feando", "Carone,Letca Jo",
                "O'Conor,Mole K", "Daeron III,Lawence P", "Randall,Jason L",
                "Esquel Mendez,Mara D", "Dinle III,Jams E", "Coras Sr.,Cleybr E",
                "Hsieh-Krnk,Caolyn E", "Graves II,Theodore R"]

    for name in names:   
        print(name, "->", re.sub("(I{1,3},|((Sr|Jr)\\.,)|,).*","",name))
1 голос
/ 18 октября 2019

Одним из вариантов может быть использование группы захвата с не жадным совпадением до первого появления запятой и, возможно, до совпадения с запятой Jr Sr jr sr или римской цифрой.

Затем сопоставьте запятую,Значение находится в группе захвата 1.

Расширенное совпадение для римской цифры можно найти, например, на этой странице , поскольку класс символов [XVICMD]+ является широким соответствием, которое также позволяетдругие комбинации.

^(\w.*?)(?: (?:[JjSs]r\.|[XVICMD]+\b))?,
  • ^ Начало строки
  • ( Захват группа 1
    • \w.*? Соответствует aслово char и 0+ раз любой символ, кроме новой строки без жадности
  • ) закрыть группу
  • (?: группа без захвата
    • (?: Подберите пробел и начните без захвата группы
      • [JjSs]r\. Сопоставьте любой из перечисленных, а затем r.
      • | Или
      • [XVICMD]+\b Матч 1+умножить любое из перечисленного и границы слова
    • ) Закрыть группу
  • )? Закрыть группу и сделать ее необязательной
  • , Соответствует запятой

Regex demo

0 голосов
/ 18 октября 2019

Вы можете использовать

^(?:(?![JS]r\.|\b(?:[XVICMD]+)\b)[^,])+\b(?<!\s)

См. Демоверсию regex

Подробности

  • ^- начало строки
  • (?:(?![JS]r\.|\b(?:[XVICMD]+)\b)[^,])+ - любой символ кроме , ([^,]), одно или несколько вхождений (+), который не запускает символ Jr. или Sr.последовательность или целое слово, состоящее из 1 или более X, V, I, C, M, D символов
  • \b - граница слова
  • (?<!\s) - пробелы слева направо запрещены (обрезка совпадает)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...