Regex (PHP вкус) для совпадения по нескольким строкам ИЛИ не по нескольким строкам

Я работаю над Regex, который будет соответствовать обоим следующим частям синтаксиса …

1.

aaa accounting system default
action-type start-stop
group tacacs+

2.

aaa accounting system default start-stop group tacacs+

Лучшее, что у меня есть, это …

^aaa accounting system default (\n action-type |)start-stop(\n |) group tacacs\+

Вышеуказанное регулярное выражение будет соответствовать синтаксису номер 2, но не 1? Выдернуть мои волосы! (Я знаю, что это, вероятно, просто, но я новичок в Regex) Есть идеи?
В начале строки 2 есть пробелы & 3 в синтаксической части номер 1, но не отображаются для реального представления о том, как представлен синтаксис, взгляните на ссылку Regex101 ниже. Спасибо!

Вот это в Regex101 …

https://regex101.com/r/lW8hT1/1

1

Решение

Вы можете заменить обычные пробелы в вашем шаблоне \s это соответствует любому пробелу:

'~^aaa\s+accounting\s+system\s+default(?:\s+action-type)?\s+start-stop\s+group\s+tacacs\+~m'

Увидеть regex demo

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

  • ^ — соответствует началу строки (из-за /m) модификатор
  • aaa\s+accounting\s+system\s+default — соответствует последовательности aaa accounting system default где \s+ соответствует одному или нескольким пробелам
  • (?:\s+action-type)? — необязательный action-type (с одним или несколькими пробелами перед action-type)
  • \s+start-stop\s+group\s+tacacs\+ — Матчи start-stop group tacacs+ которые имеют 1 или более пробелов между словами.
2

Другие решения

Это не работает, потому что у вас есть лишние пробелы в необязательных группах:

^aaa accounting system default(\n action-type|) start-stop(\n|) group tacacs\+

Вы можете написать это лучше, используя группы без захвата (?:...) и необязательный квантификатор ?:

^aaa accounting system default(?:\n action-type)? start-stop\n? group tacacs\+

(таким образом вы избегаете бесполезных захватов)

3

Для совпадения по нескольким линиям вам потребуется DOTALL флаг:

/(?s)\baaa accounting system default.*?group tacacs\+/

Или еще:

/\baaa accounting system default.*?group tacacs\+/s

RegEx Demo

2
По вопросам рекламы [email protected]