【问题标题】:preg_match between newlines and beginning or ending换行符和开始或结束之间的 preg_match
【发布时间】:2016-05-16 16:04:17
【问题描述】:

我的值中有很多行,我需要在换行符、返回和开始或结束之间运行 preg_match。

$text = "
ENG CHG NOTE
2A
LTR CHK
AH 2000
YE
NOTE 2
";

例如:

preg_match("/((?P<value>\\d+(.\\d+)*?)\s?(?P<unit>YE))/"

我想确保 preg_match 在上面的例子中只寻找数字和 YE。在此示例中,属于 AH 的 2000 将显示 YE 的错误值。如何在当前正则表达式周围包含 \r\n 和开头或结尾?

【问题讨论】:

  • "/((?P&lt;value&gt;\\d+(.\\d+)*\s*(?P&lt;unit&gt;YE))/"
  • 您是否希望它仅在整行匹配时才匹配?
  • 您能指定预期的输出吗?如果你只想匹配同一行的YE后面的数字,则需要将\s替换为\h'~((?P&lt;value&gt;\d+(?:\.\d+)*?)\h?(?P&lt;unit&gt;YE))~'
  • 您在寻找&lt;digits&gt; YE 吗?如果是这样,请使用水平空格 \h*YE 而不是 \sYE

标签: php regex preg-match


【解决方案1】:

在此示例中,属于 AH 的 2000 将显示 YE 的错误值。如何在我当前的正则表达式周围包含 \r\n 和开头或结尾?

在您的示例中,数字紧跟在 YE 之后,后跟换行符。由于\s 也匹配换行符,因此您需要调整模式以仅匹配水平空格

您可以在这里利用两种模式:\h[^\S\r\n]

'~(?P<value>\d+(?:.\d+)*?)\h?(?P<unit>YE)~'
                          ^^

看到这个regex demoPHP demo:

$re = '~(?P<value>\d+(?:.\d+)*?)\h?(?P<unit>YE)~'; 
$str = "ENG CHG NOTE\n2A\nLTR CHK\nAH 2000\nYE\nNOTE 2\n3444 YE\n"; 
preg_match_all($re, $str, $matches);
print_r($matches);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2018-06-30
    • 2014-06-27
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多