Соответствуйте регулярному выражению в любом порядке на Голанге - PullRequest
0 голосов
/ 04 октября 2019

У меня есть что-то вроде этого:

option name [p1|p2|p3] | [p4]

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

option name1 p1
option name1 p1 p4
option name1 p4 p1

Моя попытка регулярного выражения:

^(option)\s+(([a-zA-Z0-9]+))\s?(((p1|p2|p3)?)\s?((p4))?)\s?$

Это работает, если дополнительные строки предоставляются в определенном порядке, например:

option name1 p1 p4
option name1
option name1 p1
option name1 p4

, ноэтот не работает:

option name1 p4 p1

Есть ли способ написать регулярное выражение для поддержки любого порядка этих необязательных строк?

Edit : p1, p2,p3, p4 только для примера. Это может быть любая из предоставленных точных строк, например, foo, bar, baz.

Дополнительные пояснения:

имя может быть любой строкой. В идеальном сценарии он должен отличаться от foo, bar, baz и других параметров.

1 Ответ

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

Если вы хотите сопоставить оба варианта, вы можете использовать или | для перечисления каждого из 2 вариантов.

Чтобы сделать вторую часть необязательной, вы можете использовать необязательную группу без захвата (?:...)?

Пример без всех групп захвата:

^option\s+[a-zA-Z0-9]+(?:\s?(?:(?:foo|bar|baz)(?:\s?test)?|test(?:\s?(?:foo|bar|baz))?))?$

По частям это будет выглядеть как

  • ^ Начало строки
  • option\s+[a-zA-Z0-9]+ Параметр сопоставления, 1+ пробельных символов и a + символ a-zA-Z или цифры 0-9
  • (?: Группа без захвата
    • \s? Соответствует необязательному символу пробела
    • (?: Группа без захвата
      • (?:foo|bar|baz)(?:\s?test)? Соответствие, например, для баров и т. Д. И дополнительный тест
      • | Или
      • test(?:\s?(?:foo|bar|baz))? Тест на совпадениеи, необязательно, foo, bar и т. д.
    • ) Закрыть группу без захвата
  • )? Закрыть группу без захвата и сделать всю часть необязательной
  • $ Конец строки

Regex demo

...