2016-05-13 156 views
1

我有一個Perl應用程序,它可以得到兩個正則表達式的輸入。如何將perl正則表達式合併爲一個組合匹配

是否有可能將正則表達式合併爲一個正則表達式,只有在滿足兩個正則表達式條件時匹配纔會發生?

例子:

pattern1 = "^.*$" 
pattern2 = "^abc$" 

結果應該是:"^abc$"

我知道有一個所謂的「正則表達式::組裝」,但只允許我在某種程度上正則表達式的結合模塊,這兩個正則表達式的CAN創建一個匹配。

+0

'「^。* $」'........... –

+0

這只是一個例子 – Silence

回答

3

你不能將它們合併成一個正則表達式 - 這是一個比你想像的更加複雜的事情。 (在相對微不足道的情況下)。 regex是一種編程語言,爲你編寫代碼是一項不重要的任務。

但是你可以很方便地測試多個正則表達式。

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @conditions = (qr/^.*$/, qr/[A-Z]+/, qr/123/,); 

LINE: while (<DATA>) { 
    foreach my $regex (@conditions) { 
     next LINE unless m/$regex/; 
    } 
    print; 
} 

__DATA__ 
shouldn't match, non number 
1234567 
test123 
Test123 

爲了提高效率,您還可以對正則表達式進行排序,以便最有可能出現故障的先決條件。

1

這是可能的,但有一個限制。所有你需要做的是封閉的模式之一在先行斷言,像這樣:

(?=pattern1)pattern2 

這應該工作,即使模式具有內嵌修飾符((?i)或類似),在第一圖案的修飾語不應該延續到第二種模式。

我知道這個解決方案的唯一問題是反向引用(\1,\2等)。如果pattern1中有捕獲組,則pattern2中的任何反向引用都會引用錯誤的組。例如:

pattern1 = "(a)b." 
pattern2 = "a(b)\1" 
text = "abb" 

兩種模式會匹配abb,但組合圖案(?=(a)b.)a(b)\1只會匹配aba