Regex 括号可以用于正则表达式中的操作顺序吗?

Regex 括号可以用于正则表达式中的操作顺序吗?,regex,Regex,我想我的正则表达式正在运行,但我不能完全确定 正则表达式是: /(\n([ \t]*)){2,}/ 最初的目标是同时捕获两行或更多新行,因此如果有人键入\n\n\n\n,我可以做一些事情 但是,我不想在连续的新行(如尾随空格和制表符)之间产生干扰 因此,我仍然希望能够捕获\n\t\n\n\n 我不确定括号是否太夸张了 外括号表示我想要里面的一切: (\n([ \t]*)) 发生两次或两次以上 然后,内圆括号: ([ \t]*) 表示我希望在该组中包含从无到无限尾随a\n的空格和制表符的任意

我想我的正则表达式正在运行,但我不能完全确定

正则表达式是:

/(\n([ \t]*)){2,}/
最初的目标是同时捕获两行或更多新行,因此如果有人键入
\n\n\n\n
,我可以做一些事情

但是,我不想在连续的新行(如尾随空格和制表符)之间产生干扰

因此,我仍然希望能够捕获
\n\t\n\n\n

我不确定括号是否太夸张了

外括号表示我想要里面的一切:

(\n([ \t]*))
发生两次或两次以上

然后,内圆括号:

([ \t]*)
表示我希望在该组中包含从无到无限尾随a\n的空格和制表符的任意组合。使用内括号的原因是,我不希望将其解释为
(\n[\t])*
,其中
\n
被分组为可能发生的零到无限次


我的困惑源于这样一个事实:在正则表达式中,括号用于某些事情,对吗?不确定它是否像数学。

不需要内部参数。克莱恩明星只在最后一场比赛中发挥作用。在这种情况下,它是
[\t]
而不是
\n[\t]
。请注意,在regexp中,每个非特殊字符都是一个匹配操作。只有当需要将多个字符作为单个匹配操作计数时,才需要使用parens

因此,如果要执行“匹配换行符,后跟零个或多个空格”,可以执行以下操作:

但如果您想“匹配零个或多个换行符,后跟一个空格”,您可以:

免责声明:“Regex”不是一个单一的东西;相反,它是由许多不同语言和工具支持的一系列相关符号。下面的解释涉及最广泛的正则表达式形式,如Perl、Java、JavaScript、Python和PHP


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

从技术上讲,regex是一个独特的东西。它特别指与Perl兼容的regexp。传统的正则表达式是regexp,Perl样式是regex。“regex”一词最早是由Perl程序员创造的,以区别于传统的regexregexp@slebetman:胡说八道;甚至用于POSIX正则表达式的Perl库(与Perl不同)也将它们称为“正则表达式”。但即使我接受了regex专门指“Perl兼容”或“Perl风格”regex的说法,我的观点仍然站得住脚,因为即使有这样的regex,细节上也有很多变化。实际上,它甚至比这更具体。Perl程序员创造了“regex”一词,专门指Perl6正则表达式。这是因为Perl6正则表达式是图灵完备的,因此不再是正则表达式,所以人们抱怨称它为regexp是一个误称。我不确定,但我认为拉里·沃尔自己想出了正则表达式。@ Salbman:你真的应该考虑学习使用谷歌。你的评论中充满了废话,我甚至无法在这里正确地揭穿它,但举一个例子——一分钟的研究,你会发现术语“regex”在宣布将出现Perl 6之前几年是非常常见的。我明白了,但是,我使用的外圆括号是正确的,对吗?有两个组,所以我需要这些括号。@David是的,外部参数是正确的,否则
{2,}
规则只适用于空白组。无论如何,这将是一个无效的语法,因为
{x,y}
不能遵循
*
Kleene星只在最后一个匹配上起作用的语句是不合适的,因为
*
量词应用于它遵循的模式的一部分,而不是匹配值。
\n[ \t]*
(\n[ \t])*