代码之家  ›  专栏  ›  技术社区  ›  Cheng

正则表达式中()和[]的区别是什么?

  •  8
  • Cheng  · 技术社区  · 16 年前

    比如说:

    /(a|b)/ vs /[ab]/

    3 回复  |  直到 16 年前
        1
  •  21
  •   Alan Moore Chris Ballance    16 年前

    上面的例子(在大多数语言中)没有太大的区别。主要区别在于 () \1 在比赛中(有时, $1 [] 版本不这样做。

    也,

    /(ab|cd)/  # matches 'ab' or 'cd'
    /[abcd]/   # matches 'a', 'b', 'c' or 'd'
    
        2
  •  7
  •   Brian Campbell Dennis Williamson    16 年前

    () in regular expression用于对正则表达式进行分组,允许将运算符应用于整个表达式,而不是单个字符。例如,如果我有正则表达式 ab 那么 ab* a b s(例如, A. ab , abb (ab)* 指序列的任意重复次数 ab ab , abab () "foo" =~ /f(o*)/ , $1 oo .

    | 在正则表达式中表示交替;它表示条前的表达式或条后的表达式。您可以将任何数字与表达式匹配 0|1|2|3|4|5|6|7|8|9 foo|bar ,表示 foo 或 bar .

    | * 、串联(只需将两个表达式相邻写入,中间没有任何内容),以及用于分组的括号。但对于复杂的表达式来说,这将相当不方便,因此通常可以使用几种速记。例如, x? |x (即,空字符串或 x y+ 是英语的简写 yy* .

    [] | 0|1|3|4|5|6|7|8|9 ,但写起来要方便得多 [0-9] . 我也会写作 [a-zA-Z] 代表任何字母。请注意 提供分组,它们通常不会引入一个新的参考,以后可以参考;你必须用括号括起来,比如 ([a-zA-Z])

    因此,您的两个示例正则表达式在匹配方面是等价的,但是 (a|b) 将第一个子匹配设置为匹配字符,而 [ab] 不会创建对子匹配项的任何引用。

        3
  •  6
  •   Peter    16 年前

    首先,当谈到正则表达式时,指定您所谈论的正则表达式的类型通常是很重要的。有几种变体(如传统的POSIX正则表达式、Perl和Perl兼容正则表达式(PCRE)等)。

    假设PCRE或非常类似的东西,这通常是当今最常见的,有三个关键区别:

    1. 使用括号组,可以检查由多个字符组成的选项。所以/(a | b)/可能是/(abc | defg)/。
    2. 括号组执行捕获操作,这样您就可以提取结果(这样,如果它在“b”上匹配,您就可以返回“b”并查看结果)/[ab]/没有。可以通过添加?:like so:/(?:a | b)来覆盖捕获操作/