Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 什么';正则表达式中()和[]的区别是什么?_Regex - Fatal编程技术网

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

Regex 什么';正则表达式中()和[]的区别是什么?,regex,Regex,比如说: /(a | b)/与/[ab]/上述示例(在大多数语言中)没有太大区别。主要区别在于()版本创建了一个组,该组可由匹配中的\1反向引用(有时,$1)。[]版本不执行此操作 而且 首先,当谈到正则表达式时,指定您所谈论的正则表达式的类型通常是很重要的。有几种变体(如传统的POSIX正则表达式、Perl和Perl兼容正则表达式(PCRE)等) 假设PCRE或非常类似的东西,这通常是当今最常见的,有三个关键区别: 使用括号组,可以检查由多个字符组成的选项。所以/(a | b)/可能是/(ab

比如说:


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

上述示例(在大多数语言中)没有太大区别。主要区别在于
()
版本创建了一个组,该组可由匹配中的
\1
反向引用(有时,
$1
)。
[]
版本不执行此操作

而且


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

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

  • 使用括号组,可以检查由多个字符组成的选项。所以/(a | b)/可能是/(abc | defg)/
  • 括号组执行捕获操作,这样您就可以提取结果(这样,如果它在“b”上匹配,您就可以返回“b”并查看结果)/[ab]/没有。可以通过添加?:like so:/(?:a | b)来覆盖捕获操作/
  • 即使覆盖括号的捕获行为,在检查单个字符时,[]的底层实现可能仍会更快(尽管没有任何内容表明无法将非捕获(?:a | b)作为[ab]的特例进行优化,但正则表达式编译可能会花费稍长的时间)
  • 正则表达式中的
    ()
    用于对正则表达式进行分组,允许将运算符应用于整个表达式,而不是单个字符。例如,如果我有正则表达式
    ab
    ,那么
    ab*
    指的是一个
    a
    ,后跟任意数量的
    b
    s(例如,
    a
    ab
    abb
    ,等等),而
    (ab)*
    指的是序列的任意数量的重复
    ab
    (例如,空字符串,
    ab
    abab
    等)。在许多正则表达式引擎中,
    ()
    也用于创建匹配后可以引用的引用。例如,在Ruby中,在执行
    “foo”=~/f(o*)/
    之后,
    $1
    将包含
    oo

    正则表达式中的
    表示交替;它表示条前的表达式或条后的表达式。您可以将任意数字与表达式
    0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    相匹配。您经常会看到为了分组或捕获子表达式而将交替包装在一组括号中,但它是s不是必需的。您也可以对较长的表达式使用替换,如
    foo | bar
    ,以指示
    foo
    bar

    只需交替
    |
    、kleene闭包
    *
    、串联(只需将两个表达式并排编写,中间没有任何内容),就可以表达每个正则表达式(在形式、理论意义上,而不是许多语言使用的扩展意义上),和用于分组的括号。但这对于复杂的表达式来说相当不方便,因此通常有几种速记。例如,
    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]
    不会创建子匹配的任何引用。

    ()也用于表示命名组,例如reuse@rexem-是的,在你发表评论之前考虑过这一点并对其进行了编辑:)不,这是一个重要的观点-事实上,这是我使用
    (a | b)
    而不是
    [ab]
    @lexu的主要原因,一点也不<代码>(a-z)匹配文字“a-z”并创建一个组<代码>[a-z]匹配任何(单个)小写字母(来自a-z)。:-)的想法。。这是()和[]之间的另一个区别。。(问题标题和正文问了一些稍微不同的问题(
    /(ab|cd)/  # matches 'ab' or 'cd'
    /[abcd]/   # matches 'a', 'b', 'c' or 'd'