具有以下正則表達式:正則表達式反向引用
([a-z])([0-9])\1
它匹配a5a
,有沒有什麼辦法讓它也匹配a5b
,a5c
,a5d
等等?
編輯:好吧,我明白,我可以只使用([a-z])([0-9])([a-z])
,但我有一個非常漫長而複雜的正則表達式(匹配子子子-...-域或匹配一個IPv4地址)將真正受益於上述行爲。這是否有可能通過反向引用或其他方式實現?
Anon. answer正是我需要的,但它似乎是錯誤的。
具有以下正則表達式:正則表達式反向引用
([a-z])([0-9])\1
它匹配a5a
,有沒有什麼辦法讓它也匹配a5b
,a5c
,a5d
等等?
編輯:好吧,我明白,我可以只使用([a-z])([0-9])([a-z])
,但我有一個非常漫長而複雜的正則表達式(匹配子子子-...-域或匹配一個IPv4地址)將真正受益於上述行爲。這是否有可能通過反向引用或其他方式實現?
Anon. answer正是我需要的,但它似乎是錯誤的。
如果第二個字母與第一個字母無關,那麼您不需要返回引用,對嗎?
([a-z])([0-9])([a-z])+
編輯
如果你只是不想在重複過去的一部分,一遍又一遍,然後:
([a-z])([0-9])([a-z])
就收走了 '+'。
我不遵循你的問題?
[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
你能檢查一下我的編輯嗎?謝謝。 – 2010-01-14 02:03:40
正則表達式反向引用的整點是相匹配的同樣的事情指示的子表達式,所以沒有方法來禁用該行爲。
爲了獲得您想要的行爲,以後能夠重複使用正則表達式的一部分,您可以將正則表達式的部分定義爲希望在單獨的字符串中重用,以及(取決於您使用的語言'正在處理中)使用字符串插值或串聯來從各個部分構建正則表達式。
例如,在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)
我懷疑你想類似於Perl的(?PARNO)
結構的東西(它不只是遞歸)。
/([a-z])([0-9])(?1)+/
將匹配你想要什麼 - 第一擷取組的任何更改將在(?1)
比賽有什麼反映。
似乎是我在找的東西,然而你提供的正則表達式給了我RegexBuddy中的錯誤(在PCRE和Perl模式下)。 – 2010-01-14 02:15:32
適用於我的Perl版本。 – 2010-01-14 02:24:43
正則表達式的'(?1)'部分在Perl模式下給我RegexBuddy中的以下錯誤:**錯誤的字符(可能不完整的正則表達式標記或未轉義的元字符)**,無論如何。 =) – 2010-01-14 02:47:49
答案是不是反向引用
向引用意味着匹配先前匹配的值。這並不意味着與以前的表達相匹配。但是,如果你的語言允許它,你可以在編譯之前將字符串中的一個變量替換爲你的表達式。
的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}+/;
反向引用是用於檢索來自正則表達式中的早期數據並在以後使用它。他們不是爲了解決文體問題。帶反向引用的正則表達式不會像沒有正則表達式一樣運行。你可能只需要習慣regexes是重複和醜陋的。
也許試試Python,這可以很容易地從小塊建立正則表達式。不清楚你是否被允許改變你的環境......你很幸運,首先有反向引用。
謝謝麩,但請檢查我的編輯。 – 2010-01-14 02:02:56
不,我想得到你提供的第一個正則表達式的效果'([a-z])([0-9])([a-z])+',但不必一遍又一遍地重複最後一部分。 – 2010-01-14 02:17:02