2014-10-31 34 views
1

(?| ..)JavaScript中的替代捕获组编号

上述语法在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)?)) 
+0

它被称为分支重置功能。 Js不会支持这一点。 – 2014-10-31 11:58:31

+0

有没有其他选择? – Vasanth 2014-10-31 12:02:44

+0

你究竟想要达到什么目的? – sandip 2014-10-31 12:07:54

回答

3

并非所有分支重置的正则表达式都有一个没有的分支。但是,您的情况下的正则表达式可以进行平凡的重写,以避免使用分支重置功能。

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

(?| 
    \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)?))?)? 
+0

感谢您的善意帮助@nhahtdh :) – Vasanth 2014-11-03 07:55:59

+0

非常好的解决问题的方法。简化情况以提取模式,找到解决方案,然后将其应用于原始问题。你值得你的代表! – 2017-05-16 14:08:45

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中的匹配项。

+0

由于某些原因,我想仅获得分支匹配1,2,3,4。这就是为什么我使用这个(?| ...)。 – Vasanth 2014-10-31 13:41:21