Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php regexp-在模式之前匹配模式和前缀_Php_Regex - Fatal编程技术网

Php regexp-在模式之前匹配模式和前缀

Php regexp-在模式之前匹配模式和前缀,php,regex,Php,Regex,我需要匹配一个特定的模式 (?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d) 但是我还需要在模式之前获取“prefix”字符串 这是我的解决方案,但并不总是有效 ^(.*)(?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d) ^(.*)(? 很难解释,所以在这里检查一下 它太“贪婪”,并且匹配字符串中的多个模式。实际匹配是第二个匹配的“前

我需要匹配一个特定的模式

(?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d)
但是我还需要在模式之前获取“prefix”字符串

这是我的解决方案,但并不总是有效

^(.*)(?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d)
^(.*)(?
很难解释,所以在这里检查一下

它太“贪婪”,并且匹配字符串中的多个模式。实际匹配是第二个匹配的“前缀”的一部分

示例应输出两个匹配项。一个匹配项为
dk30344510
62226420


示例应将
CVR-nr.
作为前缀输出,
dk30344510
作为模式,第二个匹配应为
/Tlf.
作为前缀,
62226420
作为模式

您的正则表达式没有输出预期结果,因为您有一个字符串锚点
^
和一个贪婪点
*
。这意味着t仅从字符串的开头开始,并仅以一个成功匹配结束

解决方案

正则表达式:

\s*(.*?)\s*\b((?i:dk)?(?:\d{2}\D?){3}\d{2})\b
我没有对您的主正则表达式应用太多更改。我所做的是减少重复模式
\d{2}\d?
,并用单词边界
\b
标记替换lookarounds


您可以使用“g”选项尝试此选项以获得多个结果

^(.*?)\s(dk\d+)\s(.*?)\s(\d+)

您将模式锚定在字符串开始处,是否只在字符串开始处查找匹配项?这是您想要的吗?@revo看起来像。您做了什么?:)您的语言/环境是什么?语言是php
(*)
意味着它是不可冻结的,如果可能,它将匹配任何模式?它是不贪婪的,并且在正则表达式中接近下一个模式之前尽可能少地消耗字符。
^(.*?)\s(dk\d+)\s(.*?)\s(\d+)