Breeze

正则表达式中 [] 和 () 的区别

圆括号 () 是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理。

示例:

  • 1、(abc|bcd|cde):表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致。
  • 2、(abc)?:表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现。
  • 3、(?:abc):表示找到这样abc这样一组,但不记录,不保存到$变量中,否则可以通过$x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用 $1 获取 (aaa) 匹配到的内容,而 $3 则获取到了 (ccc) 匹配到的内容,而 $4 则获取的是由 (eee) 匹配到的内容,因为前一对括号没有保存变量。
  • 4、a(?=bbb):顺序环视 表示 a 后面必须紧跟 3 个连续的 b。
  • 5、(?i:xxxx):不区分大小写 (?s:.*) 跨行匹配.可以匹配回车符。

方括号 [] 是单个匹配,字符集/排除字符集/命名字符集。

示例:

  • 1、[0-3]:表示找到这一个位置上的字符只能是 0 到 3 这四个数字,与 (abc|bcd|cde) 的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符。
  • 2、[^0-3]:表示找到这一个位置上的字符只能是除了 0 到 3 之外的所有字符。

() 和 [] 有本质的区别

() 内的内容表示的是一个子表达式,() 本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理,例如 (ab){1,3},就表示 ab 一起连续出现最少 1 次,最多 3 次。如果没有括号的话,ab{1,3} 就表示 a,后面紧跟的 b 出现最少 1 次,最多 3 次。另外,括号在匹配模式中也很重要。这个就不延伸了,有兴趣可以自己查查。

[] 表示匹配的字符在 [] 中,并且只能出现一次,并且特殊字符写在 [] 会被当成普通字符来匹配。例如 [(a)],会匹配 (、a、)、这三个字符。

所以 ()、[] 无论是作用还是表示的含义,都有天壤之别。