Java 序列中的正则表达式差异

Java 序列中的正则表达式差异,java,regex,Java,Regex,我不清楚: (…) 和 (?:…) 在我看来,它们都产生相同的输出,但只有第一个表达式可以用于反向引用 我说得对吗?如果这确实是他们唯一的区别,为什么我们要使用第二种选择? 是为了性能吗?这是正确的-性能是主要原因。当你在做一些事情,比如筑巢群;您可能希望有“好的”捕获组供以后使用,但也需要对|操作符等进行分组。类似地,如果您正在编辑一个已经有捕获组的正则表达式,并且您想添加更多的分组,但不想影响现有的捕获组,那么您可以同样使用一个非捕获组。这是正确的-性能是主要原因。当你在做一些事情,比如筑巢

我不清楚:
(…)


(?:…)

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

我说得对吗?如果这确实是他们唯一的区别,为什么我们要使用第二种选择?

是为了性能吗?

这是正确的-性能是主要原因。当你在做一些事情,比如筑巢群;您可能希望有“好的”捕获组供以后使用,但也需要对
|
操作符等进行分组。类似地,如果您正在编辑一个已经有捕获组的正则表达式,并且您想添加更多的分组,但不想影响现有的捕获组,那么您可以同样使用一个非捕获组。

这是正确的-性能是主要原因。当你在做一些事情,比如筑巢群;您可能希望有“好的”捕获组供以后使用,但也需要对
|
操作符等进行分组。类似地,如果您正在编辑一个已经有捕获组的正则表达式,并且您想添加更多的分组,但不想影响现有的捕获组,那么您可以同样使用一个非捕获组。

这是正确的<代码>(?:…)实际上是非捕获组,不能用于反向引用。之所以使用非捕获组,是因为在许多情况下,您希望将正则表达式的某些段组合在一起,但实际上不想捕获它们。做:

  • 如果您希望对正则表达式段进行分组,并希望捕获组,请使用
    (…)
  • 当您希望对正则表达式段进行分组而不希望捕获组时,请使用
    (?:…)
  • 这是正确的<代码>(?:…)实际上是非捕获组,不能用于反向引用。之所以使用非捕获组,是因为在许多情况下,您希望将正则表达式的某些段组合在一起,但实际上不想捕获它们。做:

    • 如果您希望对正则表达式段进行分组,并希望捕获组,请使用
      (…)
    • 当您希望对正则表达式段进行分组而不希望捕获组时,请使用
      (?:…)

    • 是的,这是唯一的区别。性能和可读性(即明确你的意图)以及可能不浪费引用(你只有9个)是使用第二种语法的原因。

      是的,这是唯一的区别。性能和可读性(即明确您的意图)以及可能不浪费回引用(您只有9个)是使用第二种语法的原因。

      回引用对性能的影响高得惊人。没有反向引用的正则表达式可以实现为要执行的DFA,DFA是O(字符串长度)。对于反向引用,它必须是一个NFA,它在最坏情况下的执行时间是指数级的(但最好的情况可能相当快)


      并提供更多详细信息。

      反向引用对性能有着惊人的影响。没有反向引用的正则表达式可以实现为要执行的DFA,DFA是O(字符串长度)。对于反向引用,它必须是一个NFA,它在最坏情况下的执行时间是指数级的(但最好的情况可能相当快)

      还有更多的细节