我正在玩regexcrossword游戏,我对(T|E|N)*
和[TEN]*
之间的区别感到有些困惑。
第一个,对我来说,读作: T,E或N零到无限次。
第二个,对我来说,读作:从列表T,E或N零到无限次。
我没有看到差异。当然有一个。谢谢你的帮助!
答案 0 :(得分:9)
如果您只考虑字母..那么管道|
字母并将它们放入字符集[ ]
之间没有区别。但是不是这样的话,等等。
示例:
(batman|superman|ironman)
与[batmansupermanironman]
(batman|superman|ironman)
会匹配任何字词batman
,superman
或ironman
[batmansupermanironman]
相当于[abeimnoprstu]
并匹配此集中的任何字符
此外,字符集具有取范围的属性.. [a-z]
..如果你想使用管道将是忙碌..
当然..一个区别是捕获组,(T|E|N)
但我认为这不是你想要的......:)
答案 1 :(得分:5)
它们都匹配相同的字符串,但就输出的差异而言,(T|E|N)*
也会返回包含最后匹配字符的捕获组。
例如,给定字符串TENTEN
,(T|E|N)*
将匹配并在第一个捕获组中具有N
。另一方面,[TEN]*
将没有任何捕获组。
在性能方面,(T|E|N)*
往往会更慢,因为大多数正则表达式引擎在测试第二个分支之前测试第一个分支。
例如TENTEN
,这就是发生的事情(为了澄清而增加了空格):
Attempts to match T
T E N T E N
^
Matches T, moves on
T E N T E N
^
Attempts to match T
T E N T E N
^
Fails, attempt to match the next, E
T E N T E N
^
Matches E, moves on
T E N T E N
^
Attempts to match T
T E N T E N
^
Fails, attempt to match the next, E
T E N T E N
^
Fails, attempt to match the next, N
T E N T E N
^
Matches N, moves on
T E N T E N
^
依此类推,但是对于角色类,你可以说一切都在同一时间进行测试:
Attempts to match T, E or N
T E N T E N
^
Matches T, moves on
T E N T E N
^
Attempts to match T, E or N
T E N T E N
^
Matches E, moves on
T E N T E N
^
Attempts to match T, E or N
T E N T E N
^
Matches N, moves on
T E N T E N
^
这意味着( ... | ... )
将始终尝试匹配第一个分支,然后尝试匹配下一个分支,而[ ... ]
则不会,只是将所有内容混合在一起'。
这意味着对于简单模式(1个字符),最好使用字符类,即[TEN]*
而不是(T|E|N)*
(或(?:T|E|N)*
)。
答案 2 :(得分:2)
结果没有差异。
但是,可能存在处理所需阶段的差异。
<小时/>(T|E|N)*
流向并行查询,在树形结构中它将如下所示:(T|E|N)* -> (T|E|N) -> T|E|N -> Parallel branch T, E, N
[TEN]*
的处理方式如下:[TEN]* -> [TEN]
<小时/> 因此,
[TEN]*
优于(T|E|N)*