2012-12-30 73 views
0

還包括Perl支持條件的正則表達式:條件的正則表達式

(?(condition)true-pattern|false-pattern) 

即如果條件真,那麼嘗試其他符合真正的模式嘗試匹配的虛假模式

如果Perl的支持條件正則表達式那麼爲什麼沒有這個代碼打印1

use strict; 
use warnings; 

$_ = 'AB'; 

if (/(?(A)B|C)/) { 
    print 1; 
} 
+0

這不太可能是解決您的潛在問題的好方法。請解釋你正在嘗試做什麼 – Borodin

回答

6

Perl支持conditional patterns

你的正則表達式不只是無法比擬的,它拋出以下語法錯誤:

Unknown switch condition (?(A) in regex; marked by <-- HERE in m/(?(<-- HERE A)B|C)/ 

這是因爲A是不是一個有效的條件。

+0

你能提供一個工作的例子,說明這個條件是如何工作的以及什麼是有效的條件? – smith

+0

@smith你甚至看到我的鏈接?它列出了所有允許的條件並有其使用的例子。 – melpomene

+1

@smith我們仍然不知道你實際上想要完成什麼 –

0

我知道我遲到了這個問題,但我會盡力解釋我什麼樣的電流正則表達式是幹什麼的理解,以及如何進行調整。

是的,Perl支持條件表達式。然而,這個正則表達式的問題在於條件必須是後置引用或零寬度斷言,如後視或前瞻。換句話說,條件永遠不會消耗字符串中的任何字符。

因此,讓我們看看幾個方面,這可以重寫。

一種方法是使用一個前瞻和匹配添加到then表達。所以它可以改寫爲/(?(?=A)AB|C)/。這表示如果字符串匹配A則匹配並消耗AB否則匹配並消耗C。然後這將成功匹配ABC

另一種方式是像這樣/(A)?(?(1)B|C)/的條件之前,使用一個捕獲組。這表示匹配並消耗零或一次A;如果捕獲組1有匹配,則匹配並消耗B否則匹配並消耗C。這也將成功匹配ABC,與前面的示例相同,因爲A已被使用,並且如果該匹配項存在於字符串中,則會向前移動匹配項。

The perldoc,如其他答案中所引用的,解釋了您可以在條件中使用的其他選項,但是我覺得上面的兩個示例是最常用的。