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

时间:2016-09-14 09:26:09

标签: php regex

我需要匹配特定的模式

(?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d)

例如

dk30344510
dk30 34 45 10
30344510
30 34 45 10

但我还需要获取&#34;前缀&#34;模式之前的字符串

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

^(.*)(?<!\d|\d )(?:dk)?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(?!\d)

很难解释,所以请在这里查看。

https://regex101.com/r/fM1xD3/2

它也是&#34;贪婪的&#34;并匹配字符串中的多个模式。实际匹配是&#34;前缀&#34;的一部分。第二场比赛

该示例应输出两个匹配项。一个dk3034451062226420

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

2 个答案:

答案 0 :(得分:2)

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

<强>解决方案

正则表达式:

\s*(.*?)\s*\b((?i:dk)?(?:\d{2}\D?){3}\d{2})\b

我没有对你的主正则表达式进行很多修改。我所做的是减少重复模式\d{2}\D?并用单词边界\b标记替换外观。

<强> Live demo

答案 1 :(得分:0)

你可以尝试使用选项&#39; g&#39;获得多重结果

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

demo