2013-02-21 29 views
4

對不起,混亂的標​​題,我想不出正確的措辭。我想了解是否有正則表達式匹配不同字符串的方法,具體取決於先前的捕獲組是否被捕獲。正則表達式雙方面組件

/th?u(e|r)sday/ 

這符合tuesdaythursdaythuesdaytursday。有沒有辦法在正則表達式來表示一個部分應該只匹配,如果前面的部分是匹配的,所以,我想象一個潛在的語法像... (?#:pattern)其中#是從捕獲組數字,如果捕獲組捕獲,然後包含模式,否則它被跳過。如果沒有捕獲到# th組,則採用類似的模式(!#:pattern)。本發明的語法是爲了演示我正在嘗試做什麼。有了這個發明了語法,我可以解決我的問題上面這樣的...

/t(h)?u(!1:e)(?1:r)sday/ 

是否有任何的正則表達式語法等來實現這種類型的引用的?

回答

4

這個功能確實存在一些regex實現,並從你的例子正則表達式會被寫成這樣:

/t(h)?u(?(1)r|e)sday/ 

顯然,這不是最好的例子,因爲/t(hur|ue)sday/相當於和更短,但有些情況下這更有用。

查看this advanced regex reference page表中倒數第二個元素,並附加條件信息here

  • 語法:

    (?(1)then|else) 
    
  • 說明:

    如果第一個捕獲組的比賽中嘗試參加了迄今爲止的「那麼」部分必須爲整個正則表達式匹配匹配。如果第一個捕獲組沒有參加比賽,那麼「else」部分必須匹配整個正則表達式才能匹配。

  • 實施例:

    (a)?(?(1)b|c)匹配ab,第一cbabxcac

第二c根據同一頁,條件是支持由JGsoft enginePerlPCRE.NET framework

1

爲什麼不直接使用一個更具體的脫節?

/t(hur|ue)sday/ 
+0

因爲它是一個人爲的例子,對於這可能是一個非常有用的功能更普遍的原則。我想用它作爲更復雜匹配的一個功能。這並不能真正幫助我回答我的問題......我的意思是我可以在星期四/星期四/對嗎? – 2013-02-21 22:53:02

+1

這裏是正在使用我的想法的例子更有效:'^((來源|要)|主題):(((2)\ w + @ \ w + \ [A-Z] + |。+))'(來自:http://www.regular-expressions.info/conditional.html) – 2013-02-21 23:03:42