我正在玩 regexcrossword 游戏,我有点困惑
对我来说,第一个意思是:T、E或N出现零次或无限次。
而第二个意思是:从列表中选择 T、E 或 N 出现零次或无限次。
我看不到区别。肯定有区别。谢谢帮助!
(T|E|N)*
和 [TEN]*
之间的区别。对我来说,第一个意思是:T、E或N出现零次或无限次。
而第二个意思是:从列表中选择 T、E 或 N 出现零次或无限次。
我看不到区别。肯定有区别。谢谢帮助!
(T|E|N)*
和 [TEN]*
之间的区别。|
和将它们放入字符集[ ]
中没有区别。但是对于单词等情况则不同。(batman|superman|ironman)
与[batmansupermanironman]
不同。(batman|superman|ironman)
将匹配batman
、superman
或ironman
中的任何一个单词
- [batmansupermanironman]
等同于[abeimnoprstu]
,并匹配此集合中的任何字符[a-z]
..如果使用管道符号来做这个操作会很麻烦。(T|E|N)
但我认为这不是您想要的.. :)(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
^
( ... | ... )
总是会尝试匹配第一个分支,然后再尝试匹配下一个,而[ ... ]
则不会这样做,只是将所有内容混合在一起。[TEN]*
,而不是(T|E|N)*
(或(?:T|E|N)*
)。结果没有区别。
然而,处理所需的阶段可能存在差异。
(T|E|N)*
流到并行查询中,在树形结构中看起来像这样:(T|E|N)* -> (T|E|N) -> T|E|N -> 并行分支T、E、N
[TEN]*
处理如下:[TEN]* -> [TEN]
[TEN]*
优于 (T|E|N)*