我一直在谷歌上搜索试图自己解决这个问题,但却无法得到它...
问题:可以使用什么正则表达式来选择文本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
------------------------
由于
答案 0 :(得分:10)
标准或扩展的正则表达式语法不能这样做,但它可以做的是创建匹配组,然后您可以选择。例如:
ABC(.*)XYZ
会将ABC
和XYZ
之间的任何内容存储为\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;
}