Я работаю над 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 …
Вы можете заменить обычные пробелы в вашем шаблоне \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 или более пробелов между словами.Это не работает, потому что у вас есть лишние пробелы в необязательных группах:
^aaa accounting system default(\n action-type|) start-stop(\n|) group tacacs\+
Вы можете написать это лучше, используя группы без захвата (?:...)
и необязательный квантификатор ?
:
^aaa accounting system default(?:\n action-type)? start-stop\n? group tacacs\+
(таким образом вы избегаете бесполезных захватов)
Для совпадения по нескольким линиям вам потребуется DOTALL
флаг:
/(?s)\baaa accounting system default.*?group tacacs\+/
Или еще:
/\baaa accounting system default.*?group tacacs\+/s