我试图创建一些通用代码来简化正则表达式的使用,并考虑如何实现OR函数。
标题非常准确(ex1,ex2,ex3是任何正则表达式)。不考虑分组,它们之间的区别是什么:
"(ex1)|(ex2)|(ex3)"
和
"[(ex1)(ex2)(ex3)]"
这两者都应该是命名的正则表达式之间的关系,我可能会遗漏一些东西。一个人比另一个人更有效率吗?
答案 0 :(得分:5)
(ex1)|(ex2)|(ex3)
匹配ex1
(在第1组中提供),ex2
(在第2组中提供)或ex3
(在第3组中提供)
[(ex1)(ex2)(ex3)]
匹配(
,e
,x
,1
,2
,3
或)
答案 1 :(得分:4)
(ex1)|(ex2)|(ex3)
您正在抓取ex1
,ex2
和ex3
。
下面:
[(ex1)(ex2)(ex3)]
(
和)
被引用并按原样处理,因为它们包含在[
和]
(character classes)中,它匹配{ {1}},(
,)
,e
,x
,1
和2
。
请注意,它等同于(顺序并不重要):
3
关于字符集的重要说明:
可以包括插入符号(^)和连字符( - )。如果要包含连字符,则应将其放在字符类的最开头。如果要将插入符号作为字符集的一部分进行匹配,则不应将其作为第一个字符:
[ex123)(]
匹配不 [^]x]
和]
x
匹配[]^x]
,{{1}的所有内容}或]
^
匹配x
到[a-z]
的所有字母,a
匹配z
,[-az]
和-
答案 2 :(得分:1)
他们根本不同。
(ex1)|(ex2)|(ex3)
为文字文本ex1
,ex2
和ex3
定义了一系列交替的捕获组。也就是说,ex1
(如果存在)将被捕获在第一个捕获组中;或ex2
,如果存在,将被捕获在第二个捕获组中;或ex3
,如果存在,将在第三组中捕获。 (这将是一个相当奇怪的表达,更可能是(ex1|ex2|ex3)
,它匹配并捕获ex1
,ex2
或ex3
。)
[(ex1)(ex2)(ex3)]
定义了一个匹配以下任何字符(只有一个字符)的字符类:(ex1)23
。没有捕获组,[]
中的文字按字面处理。
Pattern
class documentation详细介绍了模式的工作原理。
答案 3 :(得分:1)
在第一个正则表达式:(ex1)|(ex2)|(ex3)
中,您将匹配由括号表示的三个组(即ex1
,ex2
,ex3
),因此您将获得结果将匹配任何ex1
正则表达式匹配,无论ex2
正则表达式匹配和ex3
正则表达式匹配。
而在第二个:[(ex1)(ex2)(ex3)]
中将没有组(因为您使用[]
括号并且括号将被视为字符。因此您将获得与(ex1)(ex2)(ex3)
表达式匹配的所有内容。
答案 4 :(得分:1)
在第一种情况下,你有3组(1到3),每组有一系列字符,用OR分隔
在第二种情况下,您有一个包含字符e
,x
,1
,2
,3
,{{的字符类1}},(
,没有群组
第一种情况与)
或ex1
或ex2
匹配,并分配给相关群组。因此,在输入ex3
的情况下,它会匹配并返回第1组等于"ex1"
,第2组和第3组"ex1"
在第二种情况下给定相同的输入null
,它将匹配所有字符,一次一个,每次连续匹配,以及每个字符"ex1"
,{{1 }和e
将被分配到组0,即整个匹配
答案 5 :(得分:0)
首先,在正则表达式中,[(abc)]
表示匹配字符:a or b or c or ( or )
没有"灌浆"发生在角色类中。 ([...]
之间)
你的另一个例子是小组赛,不同的东西。
答案 6 :(得分:0)
"(ex1)|(ex2)|(ex3)"
如果ex1
出现,则必须由第1组捕获,如果ex2
存在,则第2组将捕获它,如果ex3
出现,则将由组捕获3。
"[(ex1)(ex2)(ex3)]"
这匹配给定字符类中的单个字符。它可能是(
或e
或x
或1
或2
或3
或)