我有一個Perl應用程序,它可以得到兩個正則表達式的輸入。如何將perl正則表達式合併爲一個組合匹配
是否有可能將正則表達式合併爲一個正則表達式,只有在滿足兩個正則表達式條件時匹配纔會發生?
例子:
pattern1 = "^.*$"
pattern2 = "^abc$"
結果應該是:"^abc$"
我知道有一個所謂的「正則表達式::組裝」,但只允許我在某種程度上正則表達式的結合模塊,這兩個正則表達式的CAN創建一個匹配。
我有一個Perl應用程序,它可以得到兩個正則表達式的輸入。如何將perl正則表達式合併爲一個組合匹配
是否有可能將正則表達式合併爲一個正則表達式,只有在滿足兩個正則表達式條件時匹配纔會發生?
例子:
pattern1 = "^.*$"
pattern2 = "^abc$"
結果應該是:"^abc$"
我知道有一個所謂的「正則表達式::組裝」,但只允許我在某種程度上正則表達式的結合模塊,這兩個正則表達式的CAN創建一個匹配。
你不能將它們合併成一個正則表達式 - 這是一個比你想像的更加複雜的事情。 (在相對微不足道的情況下)。 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
爲了提高效率,您還可以對正則表達式進行排序,以便最有可能出現故障的先決條件。
這是可能的,但有一個限制。所有你需要做的是封閉的模式之一在先行斷言,像這樣:
(?=pattern1)pattern2
這應該工作,即使模式具有內嵌修飾符((?i)
或類似),在第一圖案的修飾語不應該延續到第二種模式。
我知道這個解決方案的唯一問題是反向引用(\1
,\2
等)。如果pattern1中有捕獲組,則pattern2中的任何反向引用都會引用錯誤的組。例如:
pattern1 = "(a)b."
pattern2 = "a(b)\1"
text = "abb"
兩種模式會匹配abb
,但組合圖案(?=(a)b.)a(b)\1
只會匹配aba
。
'「^。* $」'........... –
這只是一個例子 – Silence