(?| ..)
以上语法在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 :(得分: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)?))
从组索引7,8,9,10中获取所需的字符串。使用分支重置,您将获得索引1,2,3,4的匹配。