preg_match_all PHP的条件正则表达式模式


Conditional regex pattern for preg_match_all PHP

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

共有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"
  }
}

试试这个: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,所以将它们从字符类中移出。