非捕获组

时间:2019-10-28 23:40:16

标签: regex

您想在哪里使用非捕获组的示例是什么?在这里:

(?:7|8|9)

VS-

(7|8|9)

VS-

[7-9]

您是否有可能拥有一个无法被[...]取代的非捕获组?

1 个答案:

答案 0 :(得分:1)

  

您是否有可能拥有一个无法被[...]取代的非捕获组?

当然,当您要匹配的子字符串不是单个字符时,例如:

^(?:foo|bar)+$

这将匹配foobarbar之类的字符串。单独使用字符集无法做到这一点。

(?:7|8|9)
     

VS-

(7|8|9)

只要您需要 来捕获文本并在以后使用它,都应使用捕获组。例如,如果您要检查匹配项并提取匹配的组,或者想在模式的后面反向引用匹配的组。

否则,捕获组将无用,而应使用非捕获组。

在非捕获组正常工作时使用捕获组有两个问题:

  • 由于正则表达式引擎必须跟踪匹配的组(尽管它不需要这样做),因此计算上的开销更高
  • 这使模式的意图一目了然。当阅读正则表达式的某人看到一个非捕获组时,他们可以确保该组仅用于实现特定的逻辑(例如重复或交替),但是匹配的所有内容都不起作用。以后必须保持跟踪。相反,如果正则表达式的读者看到一个 capturing 组,他们可能希望以后会使用该捕获组,并且在阅读其余模式时必须牢记这一点。 。如果被俘虏的团体实际上没有在任何地方被使用,那就没有必要的认知开销。