【问题标题】:Conditional regex pattern for preg_match_all PHPpreg_match_all PHP 的条件正则表达式模式
【发布时间】:2015-11-14 01:49:56
【问题描述】:

我有一个模式。每当特定匹配组不存在时,即使跳过下一个匹配组,它也会跳过并找到另一个匹配项。

有4个捕获组。

第一组、第二组、第三组、第四组

第三组并不总是在那里。在我的示例字符串中,有 3 组。第一个不包含第三组的任何字符。我想要第三组的条件语句。如果它没有找到任何字符,那么它应该捕获空白或空格。

演示:https://regex101.com/r/zK0aW4/1

应该是这样的:https://regex101.com/r/sD4eB7/1

但我不知道如何为此分配条件。

如果第三个匹配不存在,那么它应该是空白的。我该如何用正则表达式模式写这个?

例如:

$string = "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000";

preg_match_all(
    "/([A-Z ,\.\-\&#\\\\n\/0-9&]+)(\d{10})([A-Z a-z]+)(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})/",
    $string,
    $matches
);

这应该输出如下内容:

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(78) "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000"
    [1]=>
    string(84) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000"
    [2]=>
    string(87) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000"
  }
  [1]=>
  array(5) {
    [0]=>
    string(36) "\nTHIS IS FIRST PATTERN 63101"
    [1]=>
    string(42) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n"
    [2]=>
    string(45) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n"
  }
  [2]=>
  array(3) {
    [0]=>
    string(10) "0789158126"
    [1]=>
    string(10) "0406842931"
    [2]=>
    string(10) "0112853789"
  }
  [3]=>
  array(3) {
    [0]=>
    string(15) " "
    [1]=>
    string(15) " Third match "
    [2]=>
    string(15) " Third match "
  }
  [4]=>
  array(3) {
    [0]=>
    string(17) "0-0000000-000-0000"
    [1]=>
    string(17) "0-0000000-000-0000"
    [2]=>
    string(17) "0-0000000-000-0000"
  }
}

【问题讨论】:

  • 使第一个量词非贪婪:+ => +?。为了更高效的模式,你也可以这样写:regex101.com/r/zJ9rP2/1
  • 这个字符类中的& 允许每个字符,而不是实体。例如&
  • 您将需要提供更多示例输入、预期匹配,并更清楚地告诉我们您现在所拥有的有什么问题。

标签: php regex preg-match-all


【解决方案1】:

试试这个:https://regex101.com/r/zK0aW4/2

((?:[A-Z ,.&#\/0-9-]|&|\\n)+?)(\d{10})([A-Z a-z]+)?(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})

因为您的初始组有太多匹配项,所以扩展得太远了。通过更改为非贪婪或惰性匹配(*?+?),它将尽可能少地匹配。这使得它在以下模式下表现得更好。

字符类(被[]包围)用于匹配单个字符;我假设您只想匹配文字 &\n,因此将它们移出字符类。

【讨论】:

  • 谢谢!这就是我要找的!我是正则表达式模式的新手。也感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2013-02-12
  • 2016-08-08
相关资源
最近更新 更多