我的文字如下:
This patch requires:
Patch 1.10-1
Patch 1.11-2
Notes:
我想提取
Patch 1.10-1
Patch 1.11-2
使用以下正则表达式:
This patch requires\:[\r\n](.*)[\r\n]Notes\:
但没有任何匹配。
为什么?
答案 0 :(得分:1)
为了替代解决方案:
^\QThis patch requires:\E\R+
\K
(?:^Patch.+\R)+
<小时/> 这说:
^\QThis patch requires:\E # match "This patch requires:" in one line and nothing else
\R+ # match empty lines + newlines
\K # "Forget" what's left
(?:^Patch.+\R)+ # match lines that start with "Patch"
在PHP
:
<?php
$regex = '~
^\QThis patch requires:\E\R+
\K
(?:^Patch.+\R)+
~xm';
if (preg_match_all($regex, $your_string_here, $matches)) {
// do sth. with matches
}
请参阅a demo on regex101.com(并注意verbose
和multiline
修饰符!)。
答案 1 :(得分:0)
(?<=[\r\n])(.+)(?=[\r\n])
答案 2 :(得分:0)
但没有任何匹配。
DOT .
与换行符不匹配,因此.*
不会超出一行。为此,您需要设置DOTALL s
修饰符或尝试替代[\s\S]
(字面意思是任何字符,没有任何异常)。
preg_match('~This patch requires:\s*([\s\S]*?)\s*^Notes:~m', $text, $matches);
echo $matches[1];
注意:如果要发生多个匹配,请不要使用贪婪点(.*
)而是懒惰.*?
顺便说一下,这可能是你遇到的最有效的正则表达式:
This patch requires:\s+((?:(?!\s*^Notes:).*\R)*)