序列中的正则表达式差异

时间:2012-01-21 08:22:46

标签: java regex

我不清楚之间的区别:
(...)

(?:...)

在我看来,它们都产生相同的输出,但只有第一个表达式可用于反向引用。

我说错了吗?如果这确实是他们唯一的区别,为什么我们会使用第二种选择呢? 这是为了表现吗?

4 个答案:

答案 0 :(得分:2)

这是正确的。 (?:...)实际上是非捕获组,不能用于后向引用。使用非捕获组的原因是因为有很多实例需要将正则表达式的某些段组合在一起但实际上不想捕获它们。 DO:

  • 如果您希望将正则表达式分组并想要来捕获该群组,请使用(...)
  • 如果您希望将正则表达式分组并且不希望捕获该群组,请使用(?:...)

答案 1 :(得分:2)

后退引用具有令人惊讶的高性能影响。没有后引用的正则表达式可以实现为要执行的O(string_length)的DFA。对于后向引用,它必须是一个NFA,它具有最差的指数执行时间(尽管最好的情况可能相当快)。

http://swtch.com/~rsc/regexp/regexp1.htmlhttps://softwareengineering.stackexchange.com/questions/75606/advantages-disadvantages-of-nfa-over-dfa-and-vice-versa有更多详情。

答案 2 :(得分:1)

这是正确的 - 性能是主要原因。当你做像嵌套组这样的事情时;您可能希望拥有“漂亮”的捕获组以供以后使用,但也需要为|运算符之类的内容进行分组。同样,如果您正在编辑已具有捕获组的正则表达式,并且您希望添加更多分组但又不想影响现有捕获组,则可以类似地使用非捕获组。

答案 3 :(得分:1)

是的,这是唯一的区别。性能和可读性(即使你的意图明确)并且可能不浪费返回引用(你只有9)将是使用第二种语法的理由。