2012-08-26 110 views
2

如果我想匹配一組字符,應該使用什麼樣的正則表達式,但只有兩組相同時才匹配?用於匹配連續字符串的正則表達式

例如,下面應該匹配

Hello John, Goodbye John. Hello Amy, Goodbye Amy.

但這些不應該匹配

Hello John, Goodbye Amy. Hello Amy, Goodbye John.

+0

是它只適用於你想匹配的上面的行,或者你會有一個字符串數量不同的字符串嗎? – Cdeez

+1

是你的標準,該名稱應連續相同?是否有一組特定的謂詞(Hello/Goodbye),或者你想在任何標點符號後檢查?它是一大塊文字或一系列句子的一部分嗎?你需要澄清你的問題。 –

回答

3

根據您的正則表達式引擎,可以使用反向引用的正則表達式來指代(和匹配)以前匹配的項目:

Hello (\w+), Goodbye \1. 

只有在「Goodbye」後面的文字與第一個匹配完全匹配時,纔會產生匹配。 「你好」之後的單詞)。

實施例的使用(在Python):

>>> re.findall(r'Hello (\w+), Goodbye \1.', 'Hello John, Goodbye John. Hello Amy, Goodbye Amy. ') 
['John', 'Amy'] 
>>> re.findall(r'Hello (\w+), Goodbye \1.', 'Hello John, Goodbye Amy. Hello Amy, Goodbye John. ') 
[] 
1

使用反向引用是解決此問題的簡單方法。這些是對錶達式中以前帶括號的元素的引用。

例如,下面將只匹配,如果反向引用匹配 「約翰」:

/你好(約翰),再見($ 1)/

的$ 1進行確保第二元件相匹配的第一個。

更適用於您的問題,下面將允許任何單詞字符(名稱):

/你好(\ w +),再見($ 1)/ GI

乾杯, 摹

+0

據我所知,這只是簡單地嘗試匹配'$'(行尾/字符串)和'1',我不知道任何正確的反向引用的正則表達式。它在更換時起作用,但在比賽期間不起作用。另外,歡迎來到Stack Overflow。 – Kobi

+0

我認爲這是Perl。 'perl -e'print「Hello John,Goodbye John」=〜/ Hello(John),Goodbye($ 1)/'' – nneonneo

+1

@nneonneo - 我不太瞭解perl,但是:** 1。** http: //perldoc.perl.org/perlre.html沒有提及它。 ** 2。**看起來'$ 1'試圖將當前'$ 1'的值插入到模式中,很像'$ varname'。創建正則表達式時,它應該是空的(空),因此它與'/ hello(\ w +),再見()/'相同。快速測試:http://ideone.com/nOp2B,下面是另一個有趣的地方,我們捕獲'$ 1':http://ideone.com/YPOH2 – Kobi

相關問題