preg_match_all PHP 的条件正则表达式模式
Conditional regex pattern for preg_match_all PHP
我有一个模式。每当特定匹配组不存在时,即使跳过下一个匹配组,它也会跳过并找到另一个匹配项。
有4个捕获组。
第一组,第二组,第三组,第四组
第三组并不总是在那里。在我的示例字符串中,有 3 组。第一个不包含第三组的任何字符。我想要第三组的条件语句。如果它没有找到任何字符,那么它应该捕获空白或 space.
演示: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})
因为您的初始组有太多匹配项,所以扩展得太远了。通过更改为非贪婪或惰性匹配(*?
或 +?
),它将尽可能少地匹配。这使得它在以下模式下表现得更好。
字符classes(被[
和]
包围)用于匹配单个字符;我假设您只想匹配文字 &
和 \n
,因此将它们从字符 class.
中移出
我有一个模式。每当特定匹配组不存在时,即使跳过下一个匹配组,它也会跳过并找到另一个匹配项。
有4个捕获组。
第一组,第二组,第三组,第四组
第三组并不总是在那里。在我的示例字符串中,有 3 组。第一个不包含第三组的任何字符。我想要第三组的条件语句。如果它没有找到任何字符,那么它应该捕获空白或 space.
演示: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})
因为您的初始组有太多匹配项,所以扩展得太远了。通过更改为非贪婪或惰性匹配(*?
或 +?
),它将尽可能少地匹配。这使得它在以下模式下表现得更好。
字符classes(被[
和]
包围)用于匹配单个字符;我假设您只想匹配文字 &
和 \n
,因此将它们从字符 class.