正则表达式匹配指定分隔符之间的文本? (我自己无法得到它)

时间:2009-09-28 04:13:25

标签: regex

我一直在谷歌上搜索试图自己解决这个问题,但却无法得到它...

问题:可以使用什么正则表达式来选择文本BETWEEN(但不包括)分隔符文本。举个例子:

Start Marker=ABC
Stop Marker=XYZ

---input---
This is the first line
And ABCfirst matched hereXYZ
and then
again ABCsecond matchXYZ
asdf
------------

---expected matches-----
[1] first matched here
[2] second match
------------------------

由于

3 个答案:

答案 0 :(得分:10)

标准或扩展的正则表达式语法不能这样做,但它可以做的是创建匹配组,然后您可以选择。例如:

ABC(.*)XYZ

会将ABCXYZ之间的任何内容存储为\1(也称为第1组)。

如果您正在使用PCRE(Perl兼容的正则表达式),也可以使用前瞻和后瞻断言 - 但是组是更便携且性能更好的解决方案。此外,如果您正在使用PCRE,则应使用*?确保匹配非贪婪,并在第一时间终止。

您可以在Python解释器中自行测试(Python正则表达式语法是PCRE派生的):

>>> import re
>>> input_str = '''
... This is the first line
... And ABC first matched hereXYZ
... and then
... again ABCsecond matchXYZ
... asdf
... '''
>>> re.findall('ABC(.*?)XYZ', input_str)
[' first matched here', 'second match']

答案 1 :(得分:3)

/ ABC(。*?)XYZ /

默认情况下,正则表达式匹配是贪婪的。 '?'之后 。通配符,表示最小匹配,因此第一个匹配为:

first matched here

......而不是:

first matched hereXYZ
and then
again ABCsecond match 

答案 2 :(得分:0)

您想要非贪婪的匹配.*?

while( $string =~ /ABC(.*?)XYZ/gm ) {
  $match = $1;
}