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

时间:2015-05-16 12:14:54

标签: regex

我正在玩regexcrossword游戏,我对(T|E|N)*[TEN]*之间的区别感到有些困惑。

第一个,对我来说,读作: T,E或N零到无限次

第二个,对我来说,读作:从列表T,E或N零到无限次

我没有看到差异。当然有一个。谢谢你的帮助!

3 个答案:

答案 0 :(得分:9)

如果您只考虑字母..那么管道|字母并将它们放入字符集[ ]之间没有区别。但是不是这样的话,等等。

示例:

(batman|superman|ironman)[batmansupermanironman]

不同
  • (batman|superman|ironman)会匹配任何字词batmansupermanironman

  • [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
这意味着引擎正在通过4个阶段处理输入文本以进行匹配。 [TEN]*的处理方式如下:[TEN]* -> [TEN]
只有2个阶段来处理匹配的输入文本。

<小时/> 因此,[TEN]*优于(T|E|N)*