【问题标题】:Regular Expression what is the difference between (T|E|N)* and [TEN]* [duplicate]正则表达式 (T|E|N)* 和 [TEN]* 有什么区别 [重复]
【发布时间】:2015-05-16 12:14:53
【问题描述】:

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

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

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

我看不出有什么不同。肯定有一个。感谢您的帮助!

【问题讨论】:

  • 第一个捕获一次但不是后者。
  • @gaussblurinc 建议搜索词或提供一个好的指南链接怎么样?我在这里发布的原因是因为我在不了解问题空间的情况下用尽了我能够在 Google 上搜索的内容。如果您发布了一些链接或建议的搜索词,您将帮助其他人,并且您会不那么傲慢。否则你的评论只是......懒惰。
  • 关于正则表达式的数千个问题。其中只有近 0.1% 对正则表达式牛仔真正感兴趣,但几乎所有这些都是无用的。为什么这样?因为百科告诉你:everything you need to knowsearch 可以将你的问题突出为 X 射线

标签: regex


【解决方案1】:

如果您只考虑字母.. 那么管道| 字母和将它们放入字符集[ ] 之间没有区别.. 但单词等情况并非如此..

例子:

(batman|superman|ironman)[batmansupermanironman] 不同

  • (batman|superman|ironman) 将匹配任何单词batmansupermanironman

  • [batmansupermanironman] 等价于 [abeimnoprstu] 并匹配此集合中的任何字符

字符集也有取值范围的属性。[a-z]..如果你想使用管道会很忙..

当然.. 一个区别是捕获组,(T|E|N),但我认为这不是您想要的.. :)

【讨论】:

  • 对,对,对。非常感谢我的案例,因为我只检查单个字母没有区别,但是如果我要检查的话,那我会看到不同之处。干杯。我会尽快接受你的回答。
  • 很高兴为您提供帮助.. 并感谢 :)
【解决方案2】:

它们都匹配相同的字符串,但就输出的差异而言,(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)*)。

【讨论】:

    【解决方案3】:

    结果没有区别。

    但是,处理所需的阶段可能存在差异。


    (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)*

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2013-11-09
      • 2013-04-16
      相关资源
      最近更新 更多