使用正则表达式获取由cariage返回分隔的文本的一部分

时间:2018-02-07 09:34:59

标签: php regex

我的文字如下:

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\:

但没有任何匹配。

为什么?

3 个答案:

答案 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(并注意verbosemultiline修饰符!)。

答案 1 :(得分:0)

(?<=[\r\n])(.+)(?=[\r\n])

怎么样?

Demo

答案 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)*)

Live demo