正则表达式 (T|E|N)* 和 [TEN]* 有什么区别?

3
我正在玩 regexcrossword 游戏,我有点困惑 (T|E|N)*[TEN]* 之间的区别。
对我来说,第一个意思是:T、E或N出现零次或无限次
而第二个意思是:从列表中选择 T、E 或 N 出现零次或无限次
我看不到区别。肯定有区别。谢谢帮助!

1
第一个能够捕获一次,但后面的不能。 - YOU
@gaussblurinc,你能否提供一些搜索词或者一个好的指南链接呢?我在这里发帖的原因是因为我已经在谷歌上尽力搜索了,但是由于对问题领域不太了解,所以没有找到有用的信息。如果你能发布一些链接或者建议一些搜索词,那么你将会帮助到其他人,并且这样做也不会显得傲慢。否则,你的评论就只是...懒惰的表现。 - mez.pahlan
有关正则表达式的问题问了上千个。只有近0.1%的问题对于正则表达式专家来说真正有趣,但几乎所有问题都是无用的。为什么呢?因为百科全书告诉你:你需要知道的一切,而搜索可以像X光一样突出你的问题。 - gaussblurinc
3个回答

10
如果您只考虑字母..那么使用管道符号|和将它们放入字符集[ ]中没有区别。但是对于单词等情况则不同。
例如: (batman|superman|ironman)[batmansupermanironman]不同。
- (batman|superman|ironman)将匹配batmansupermanironman中的任何一个单词 - [batmansupermanironman]等同于[abeimnoprstu],并匹配此集合中的任何字符
此外,字符集还具有取范围的属性..[a-z]..如果使用管道符号来做这个操作会很麻烦。
当然..一个区别是捕获组,(T|E|N)但我认为这不是您想要的.. :)

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mez.pahlan
很高兴能帮忙.. 谢谢 :) - karthik manchala

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

结果没有区别。

然而,处理所需的阶段可能存在差异。


(T|E|N)* 流到并行查询中,在树形结构中看起来像这样:
(T|E|N)* -> (T|E|N) -> T|E|N -> 并行分支T、E、N
这意味着引擎传递了4个阶段来处理匹配输入文本。
[TEN]* 处理如下:[TEN]* -> [TEN]
只需要2个阶段处理匹配输入文本。


因此,[TEN]* 优于 (T|E|N)*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接