2012-08-26 106 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

相关问题