JavaScript中的备用捕获组编号

时间:2014-10-31 11:50:34

标签: javascript regex

(?| ..)

以上语法在Perl中可用。我在JavaScript中尝试过相同的功能,但它并不适用于我。

有人可以建议我如何在JavaScript中使用它?

我试图将以下正则表达式转换为在JavaScript中使用:

(?|\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?))

2 个答案:

答案 0 :(得分:3)

并非所有带分支重置的正则表达式都具有相同的版本。但是,您的案例中的正则表达式可以简单地重写,以避免使用分支重置功能。<​​/ p>

让我们看看你的正则表达式:

(?|
  \s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|
  \s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|
  \s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)
)

由于下一个替代方案本质上是前一个替代语法的前缀,因此可以通过使尾部可选来合并两个分支。

让我们看一下你的正则表达式的简化视图:

(?|
  ABC|
  AB|
  C
)

可以在没有分支重置的情况下重写正则表达式:

A(?:B(?:C)?)?

重写的正则表达式不会牺牲原始正则表达式中的任何功能。您甚至可以使用此正则表达式替换当前在PCRE中使用的正则表达式。

\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)(?:[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)(?:[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?))?)?

答案 1 :(得分:2)

只需将(?|...) branch reset group转为(?:..) non-capturing group

(?:\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)[\S\s]*?\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?)|\s+1+\s+([\d]+)\s+((?:\w+)(?:[\.]ms[\.]com)?))

DEMO

从组索引7,8,9,10中获取所需的字符串。使用分支重置,您将获得索引1,2,3,4的匹配。