2011-04-08 94 views
1

如何在包含第一次出现和排除第二次出现的同时获得序列的第一次和第二次出现之间的文本?在第一次和第二次出现序列之间获取文本

因此,例如:

让我的顺序是= "xx - "
让我的文字是= "xx - blablabla bla blaxx - blablabla bla bla xx - blabla"

所以我想我的正则表达式来获得这个块:

"xx - blablabla bla bla" 

我试着像这样:

^xx - .*xx - 

但这会得到第一个和第三个事件之间的文本,并不排除上次发生。

回答

3
(xx -)(.*?)\1 

说明

 
(xx -)  # your sequence (group 1) 
(.*?)  # anything, match non-greedily into group 2 
\1   # whatever group 1 was 

你要组2

的内容,请注意,正则表达式引擎使用不同风格的背参考的,以\1最常见的选择是$1


这就是为什么你的方法不起作用:你的错误是非常普遍的。它包括认为.*以某种方式神奇地停止在正确的点,让其余的正则表达式匹配。它不是。

.*直接到行/字符串的末尾,没有任何考虑。这就是所谓的“贪婪匹配”。当它碰到字符串的末尾时,会发生回溯。正则表达式的其余部分可以匹配的第一个点是您的序列的最后一次出现,从字符串的末尾看到。你会以最长的匹配结束。

.*?做所谓的“非贪婪匹配”。它在移动到下一个字符之前检查其余的正则表达式。这就是为什么你的序列的第一次出现可以匹配。你会以最短的比赛结束。

+0

这里棘手的部分是他也想要第一个分隔符。我还没有能够想出一个正则表达式来做到这一点。我最近来的是:'(xx - )。*?(?= \ 1)',它返回2个匹配。即使如此,如果字符串中没有第二个分隔符,它也不会起作用。 – Talljoe 2011-04-08 09:17:57

+0

@Talljoe:好像在比赛结束后你不能连接组1和组2的结果。 ;-)一个人可以使事情变得比他们复杂得多...... – Tomalak 2011-04-08 09:22:32

+0

@Tomalak,真的。虽然试图找到一个单一的解决方案。 Concat在这里可能无法使用。 – Talljoe 2011-04-08 09:27:58

0

根据您的语言,

>> string="xx - blablabla bla blaxx - blablabla bla bla xx - blabla" 
=> "xx - blablabla bla blaxx - blablabla bla bla xx - blabla" 
>> string.split("xx -")[1] 
=> " blablabla bla bla" 
>> "xx -" + string.split("xx -")[1] 
=> "xx - blablabla bla bla" 
>> 

做 “XX - ” 分裂。你想要的项目总是在第二个位置,即索引1.加回“xx - ”得到最终的字符串。不需要太多的正则表达式。

相关问题