2010-01-14 58 views
2

具有以下正則表達式:正則表達式反向引用

([a-z])([0-9])\1 

它匹配a5a,有沒有什麼辦法讓它也匹配a5ba5ca5d等等?


編輯:好吧,我明白,我可以只使用([a-z])([0-9])([a-z]),但我有一個非常漫長而複雜的正則表達式(匹配子子子-...-域匹配一個IPv4地址)將真正受益於上述行爲。這是否有可能通過反向引用或其他方式實現?


Anon. answer正是我需要的,但它似乎是錯誤的。

回答

2

如果第二個字母與第一個字母無關,那麼您不需要返回引用,對嗎?

([a-z])([0-9])([a-z])+ 

編輯

如果你只是不想在重複過去的一部分,一遍又一遍,然後:

([a-z])([0-9])([a-z]) 

就收走了 '+'。

+0

謝謝麩,但請檢查我的編輯。 – 2010-01-14 02:02:56

+0

不,我想得到你提供的第一個正則表達式的效果'([a-z])([0-9])([a-z])+',但不必一遍又一遍地重複最後一部分。 – 2010-01-14 02:17:02

0

我不遵循你的問題?

[a-z][0-9][a-z] Exactly 1 
[a-z][0-9][a-z]? One or 0 
[a-z][0-9][a-z]+ 1 or more 
[a-z][0-9][a-z]* 0 or more 
+0

你能檢查一下我的編輯嗎?謝謝。 – 2010-01-14 02:03:40

2

正則表達式反向引用的整點是相匹配的同樣的事情指示的子表達式,所以沒有方法來禁用該行爲。

爲了獲得您想要的行爲,以後能夠重複使用正則表達式的一部分,您可以將正則表達式的部分定義爲希望在單獨的字符串中重用,以及(取決於您使用的語言'正在處理中)使用字符串插值或串聯來從各個部分構建正則表達式。

例如,在Ruby中:

>> letter = '([a-z])' 
=> "([a-z])" 
>> /#{letter}([0-9])#{letter}+/ =~ "a5b" 
=> 0 
>> /#{letter}([0-9])#{letter}+/ =~ "a51" 
=> nil 

或者在JavaScript:

var letter = '([a-z])'; 
var re = new RegExp(letter + '([0-9])' + letter + '+'); 
"a5b".match(re) 
1

我懷疑你想類似於Perl的(?PARNO)結構的東西(它不只是遞歸)。

/([a-z])([0-9])(?1)+/ 

將匹配你想要什麼 - 第一擷取組的任何更改將在(?1)比賽有什麼反映。

+0

似乎是我在找的東西,然而你提供的正則表達式給了我RegexBuddy中的錯誤(在PCRE和Perl模式下)。 – 2010-01-14 02:15:32

+0

適用於我的Perl版本。 – 2010-01-14 02:24:43

+0

正則表達式的'(?1)'部分在Perl模式下給我RegexBuddy中的以下錯誤:**錯誤的字符(可能不完整的正則表達式標記或未轉義的元字符)**,無論如何。 =) – 2010-01-14 02:47:49

3

答案是不是反向引用

向引用意味着匹配先前匹配的值。這並不意味着與以前的表達相匹配。但是,如果你的語言允許它,你可以在編譯之前將字符串中的一個變量替換爲你的表達式。

的Tcl:

set exp1 "([a-z])" 
regexp "${exp1}([0-9])${exp1}+" $string 

的Javascript:

var exp1 = '([a-z])'; 
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+'); 
string.match(regexp); 

的Perl:

my $exp1 = '([a-z])'; 
$string =~ /${exp1}([0-9])${exp1}+/; 
0

反向引用是用於檢索來自正則表達式中的早期數據並在以後使用它。他們不是爲了解決文體問題。帶反向引用的正則表達式不會像沒有正則表達式一樣運行。你可能只需要習慣regexes是重複和醜陋的。

也許試試Python,這可以很容易地從小塊建立正則表達式。不清楚你是否被允許改變你的環境......你很幸運,首先有反向引用。

相關問題