正则表达式(PHP风格)匹配乘法线或不匹配多行

时间:2016-01-29 11:17:11

标签: php regex multiline

我正在使用正则表达式,它将匹配以下两种语法...

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\+

上面的Regex会匹配语法编号2而不是1吗?拉出我的头发! (我知道它可能很简单,但我是一个正则表达式新手)任何想法? 第2行和第2行的开头有空格。语法片段1中的3,但是没有显示以真实地查看语法的呈现方式,请查看下面的Regex101链接。谢谢!

这是在Regex101 ......

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

3 个答案:

答案 0 :(得分:3)

它不起作用,因为您的可选组中有多余的空格:

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

您可以使用非捕获组(?:...)和可选的量词?以更好的方式编写它:

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

(以这种方式避免无用的捕获)

答案 1 :(得分:2)

要匹配多行,您需要DOTALL标记:

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

否则:

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

RegEx Demo

答案 2 :(得分:2)

您可以使用匹配任何空格的\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\+ - 匹配单词之间有1个或多个空格的 start-stop group tacacs+