регулярное выражение: соответствует всему, но не определенной многобуквенной строке в функции VBA Excel (регулярное выражение, несмотря ни на что, кроме Visual Basic)

Ребята, вот еще одно на regex: сопоставьте все, но не ..., но пока не похоже, что это соответствует моему простому вопросу.

Мне нужно запрограммировать функцию Excel для отделения строк от их предыдущих перечислителей (аналогично тому, как это сделано здесь: Регулярное выражение VBA: извлечение нескольких строк между строками в ячейке Excel с помощью пользовательской функции)

Моя первая простая строка: 1 Rome; 2 London; 3 Wembley Stadium

Моя вторая строка выглядит так: 1.1 Winner; 2.1 Looser; 3.3 Penalties (always loose, dam)

И мне нужно извлечь только имена, но не ранги (например, Rome; London; Wembley Stadium и Winner; Looser; Penalties (always loose, dam)).

Используя тестер регулярных выражений (https://extendsclass.com/regex-tester.html), Я могу просто сопоставить противоположное:

([0-9]+\s*) и это дает мне:

1 Рим, 2 Лондон, 3 Стадион Уэмбли.

Но как обратить вспять? Я пробовал что-то вроде:

[^0-9 |;]+[^0-9 |;], но он также исключает пробелы, которые я хочу сохранить (например, после запятой и между «Уэмбли» и «Стадион», ... 1 Rome, 2 London, 3 Wembley Stadium). Я предполагаю, что 0-9 нужно как-то определить как одну непрерывную строку. Пробовал разные скобки, кавычки, \s*, но ничего не получилось.

Примечание. Я работаю в среде Visual Basic и не разрешаю просмотр назад!
Примечание. Мои решения должны быть максимально совместимы между версиями Excel!


person MsGISRocker    schedule 23.07.2021    source источник
comment
Если вы хотите получить список отдельных имен, то простым способом будет разделение на ; и зацикливание на удалении начальных пробелов/цифр. Если вы хотите, чтобы имена были в одной строке вместе, просто сопоставьте цифровую часть (\d*(\.?\d+)\s+) и RegEx. Замените ее на "".   -  person Alex K.    schedule 23.07.2021
comment
Вы должны просто добавить (?:\.\d+)*, чтобы соответствовать нулю или большему количеству вхождений . и одной или нескольким цифрам, \d+(?:\.\d+)*\s*(.*?)(?=;\s*\d+(?:\.\d+)*\s|$)   -  person Wiktor Stribiżew    schedule 23.07.2021
comment
Это решение решило проблему?   -  person Wiktor Stribiżew    schedule 24.07.2021
comment
@Wiktor: Почему-то нет, хотя мне это кажется логичным. Он включает также числовой префикс в моей функции VBA. Не знаю, почему.   -  person MsGISRocker    schedule 26.07.2021
comment
Опять же, используйте только match.Submatches(0). Конечно, номер будет приземляться в течение всего матча.   -  person Wiktor Stribiżew    schedule 26.07.2021


Ответы (1)


Я попытался отрицать числовые значения и точку как одну непрерывную строку ([^\d|\.]). Это сохранит два пробела в некоторых местах. Проверить регулярное выражение 1

Группировка объяснений по группам regexr Пояснение

Чтобы удалить эти двойные пробелы, попробуйте ([^\d|\.])(?<!; ). Здесь я просто добавляю отрицательный взгляд, который может не поддерживаться всеми интерпретаторами регулярных выражений.

проверить регулярное выражение 2

Объяснение и предупреждение об отрицательном ретроспективном анализе

person Echo9k    schedule 23.07.2021