可以将括号用于Regex中的操作顺序吗?

时间:2016-02-12 06:44:18

标签: regex

我认为我的正则表达式有效,但我不完全确定。

正则表达式是:

/(\n([ \t]*)){2,}/

最初的目标是一起捕获两个或多个新行,所以如果有人输入\n\n\n\n\n,我可以用它做点什么。

但是,我不希望连续的新行如尾随空格和制表符之间的干扰......

所以我仍然希望能够抓住\n \t \n\n \n

我不确定括号是否过度。

外括号表示我想要所有内容:

(\n([ \t]*))

发生两次或更多次。

然后,内括号:

([ \t]*)

表示我想要任何空格和制表符的组合,范围从none到无穷大,后面的\ n将包含在该组中。内括号的原因是因为我不希望它被解释为(\n[ \t])*,其中\n被分组为可能发生的零到无穷大时间。

我的困惑源于括号用于正则表达式中的某些事物,对吧?不确定它是否像数学一样。

2 个答案:

答案 0 :(得分:2)

免责声明:“正则表达式”并非一件事;相反,它是由许多不同语言和工具支持的相关符号系列。以下说明适用于最常见的正则表达式,例如Perl,Java,JavaScript,Python和PHP。

  • 是的,括号会导致分组,就像在数学中一样。
  • 此外,括号通常“捕获”它们匹配的文本,允许稍后引用该文本。例如,/([a-z])\1/匹配小写的ASCII字母,然后再次匹配相同的字母。 (因此,它与ee匹配,但不与ef匹配。)您可以通过编写(?:...)而非(...)来禁用此捕获。
  • 然而,就像在数学中一样,你并不总是需要括号,因为有时默认的“操作顺序”是合适的。正如我们通常不写(2 x )+ 3,因为它相当于2 x + 3,我们通常不会写\n([ \t]*),因为它相当于\n[ \t]*

答案 1 :(得分:1)

内部的parens是没有必要的。 Kleene明星仅适用于最后一场比赛。在这种情况下,[ \t]不是\n[ \t]。请注意,在regexp中,每个非特殊字符都是一个匹配操作。只有当您需要将多个字符计为单个匹配操作时,才需要使用parens。

所以,如果你想做"匹配换行符后跟零或更多空格"你这样做:

\n[ \t]*

但是如果你想做"匹配零个或多个换行符后跟一个空格"你这样做:

(\n[ \t])*