還包括Perl支持條件的正則表達式:條件的正則表達式
(?(condition)true-pattern|false-pattern)
即如果條件真,那麼嘗試其他符合真正的模式嘗試匹配的虛假模式
如果Perl的支持條件正則表達式那麼爲什麼沒有這個代碼打印1
?
use strict;
use warnings;
$_ = 'AB';
if (/(?(A)B|C)/) {
print 1;
}
還包括Perl支持條件的正則表達式:條件的正則表達式
(?(condition)true-pattern|false-pattern)
即如果條件真,那麼嘗試其他符合真正的模式嘗試匹配的虛假模式
如果Perl的支持條件正則表達式那麼爲什麼沒有這個代碼打印1
?
use strict;
use warnings;
$_ = 'AB';
if (/(?(A)B|C)/) {
print 1;
}
Perl支持conditional patterns
。
你的正則表達式不只是無法比擬的,它拋出以下語法錯誤:
Unknown switch condition (?(A) in regex; marked by <-- HERE in m/(?(<-- HERE A)B|C)/
這是因爲A
是不是一個有效的條件。
我知道我遲到了這個問題,但我會盡力解釋我什麼樣的電流正則表達式是幹什麼的理解,以及如何進行調整。
是的,Perl支持條件表達式。然而,這個正則表達式的問題在於條件必須是後置引用或零寬度斷言,如後視或前瞻。換句話說,條件永遠不會消耗字符串中的任何字符。
因此,讓我們看看幾個方面,這可以重寫。
一種方法是使用一個前瞻和匹配添加到then
表達。所以它可以改寫爲/(?(?=A)AB|C)/
。這表示如果字符串匹配A
則匹配並消耗AB
否則匹配並消耗C
。然後這將成功匹配AB
或C
。
另一種方式是像這樣/(A)?(?(1)B|C)/
的條件之前,使用一個捕獲組。這表示匹配並消耗零或一次A
;如果捕獲組1
有匹配,則匹配並消耗B
否則匹配並消耗C
。這也將成功匹配AB
或C
,與前面的示例相同,因爲A
已被使用,並且如果該匹配項存在於字符串中,則會向前移動匹配項。
The perldoc,如其他答案中所引用的,解釋了您可以在條件中使用的其他選項,但是我覺得上面的兩個示例是最常用的。
這不太可能是解決您的潛在問題的好方法。請解釋你正在嘗試做什麼 – Borodin