"(ex1)|(ex2)|(ex3)"之间的区别是什么?和" [(ex1)(ex2)(ex3)]"

时间:2014-11-27 09:48:13

标签: java regex

我试图创建一些通用代码来简化正则表达式的使用,并考虑如何实现OR函数。

标题非常准确(ex1,ex2,ex3是任何正则表达式)。不考虑分组,它们之间的区别是什么:

"(ex1)|(ex2)|(ex3)"

"[(ex1)(ex2)(ex3)]"

这两者都应该是命名的正则表达式之间的关系,我可能会遗漏一些东西。一个人比另一个人更有效率吗?

7 个答案:

答案 0 :(得分:5)

(ex1)|(ex2)|(ex3)匹配ex1(在第1组中提供),ex2(在第2组中提供)或ex3(在第3组中提供)

Regular expression visualization

Debuggex Demo


[(ex1)(ex2)(ex3)]匹配(ex123)

Regular expression visualization

Debuggex Demo

答案 1 :(得分:4)

(ex1)|(ex2)|(ex3)

您正在抓取ex1ex2ex3

下面:

[(ex1)(ex2)(ex3)]

()被引用并按原样处理,因为它们包含在[]character classes)中,它匹配{ {1}},()ex12

请注意,它等同于(顺序并不重要):

3

关于字符集的重要说明:

可以包括插入符号(^)和连字符( - )。如果要包含连字符,则应将其放在字符类的最开头。如果要将插入符号作为字符集的一部分进行匹配,则不应将其作为第一个字符:

  • [ex123)(] 匹配 [^]x]] x匹配[]^x],{{1}的所有内容}或]
  • ^匹配x[a-z]的所有字母,a匹配z[-az]-

答案 2 :(得分:1)

他们根本不同。

(ex1)|(ex2)|(ex3)为文字文本ex1ex2ex3定义了一系列交替的捕获组。也就是说,ex1(如果存在)将被捕获在第一个捕获组中;或ex2,如果存在,将被捕获在第二个捕获组中;或ex3,如果存在,将在第三组中捕获。 (这将是一个相当奇怪的表达,更可能是(ex1|ex2|ex3),它匹配并捕获ex1ex2ex3。)

[(ex1)(ex2)(ex3)]定义了一个匹配以下任何字符(只有一个字符)的字符类:(ex1)23。没有捕获组,[]中的文字按字面处理。

Pattern class documentation详细介绍了模式的工作原理。

答案 3 :(得分:1)

在第一个正则表达式:(ex1)|(ex2)|(ex3)中,您将匹配由括号表示的三个组(即ex1ex2ex3),因此您将获得结果将匹配任何ex1正则表达式匹配,无论ex2正则表达式匹配和ex3正则表达式匹配。

而在第二个:[(ex1)(ex2)(ex3)]中将没有组(因为您使用[]括号并且括号将被视为字符。因此您将获得与(ex1)(ex2)(ex3)表达式匹配的所有内容。

答案 4 :(得分:1)

  • 在第一种情况下,你有3组(1到3),每组有一系列字符,用OR分隔

  • 在第二种情况下,您有一个包含字符ex123,{{的字符类1}},(,没有群组

  • 第一种情况与)ex1ex2匹配,并分配给相关群组。因此,在输入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)]"

这匹配给定字符类中的单个字符。它可能是(ex123)