2014-10-31 36 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