Regex Match жадные, необязательные, не захватывающие группы - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь захватить два фрагмента строки, но игнорирую что-либо после, если будет найден один из двух токенов.

Примеры:

a/b/c будет match (1) a/b/ и (2) c a/b будут соответствовать (1) a/ и (2) b a будут соответствовать (1) <nil> и (2) a 1016 1023 *

Примеры:

a/b/c/foo/d игнорирует /foo/d и соответствует (1) a/b/ и (2) c a/b/c/bar/d игнорирует /bar/d и match (1) a/b/ и (2) c

Итак, я попробовал это: ^(.*/)*(.*)(?:/(?:foo|bar)/.*)$ и второй набор примеров совпадает, но первый нет ... потому что я не сделайте вторую половину необязательной.

Затем я попытался сделать ее необязательной ^(.*/)*(.*)(?:/(?:foo|bar)/.*)?$: и теперь жадность первой части берет верх, и ничего не совпадает.

Есть ли способ заставить это работать?

1 Ответ

1 голос
/ 29 мая 2020

Кажется, вы можете использовать

^((?:(?!/(?:foo|bar)/).)*/)?([^/]*)(?:/(?:foo|bar)/.*)?$

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • ((?:(?!/(?:foo|bar)/).)*/)? - Необязательная группа захвата # 1:
    • (?:(?!/(?:foo|bar)/).)* - любой символ, 0 или более вхождений (как можно больше), которые не начинаются (т.е. не является первым символом) последовательность символов /foo/ или /bar/
    • / - a / char
  • ([^/]*) - Группа 2: любой ноль или более символов, кроме / char
  • (?:/(?:foo|bar)/.*)? - необязательная группа без захвата, соответствующая 1 или 0 вхождений
    • /(?:foo|bar)/ - /foo/ или /bar/
    • .* - любые 0 или более символов, кроме символов разрыва строки, как можно больше
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...