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或非常类似的东西,这通常是当今最常见的,有三个关键区别:
()
用于对正则表达式进行分组,允许将运算符应用于整个表达式,而不是单个字符。例如,如果我有正则表达式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'