2016-09-14 98 views
1

之前,我需要匹配特定的模式正則表達式 - 匹配模式和前綴模式

(?<!\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 

但我也需要模式

這是我的解決方案之前,以獲取「前綴」字符串,但它並不總是工作

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

這很難解釋,以便檢查在這裏。

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

它太「貪心」和字符串匹配多個模式。實際匹配在這裏是第二次匹配的「前綴」的一部分

該示例應該輸出兩個匹配。一個與dk3034451062226420

的例子應該爲前綴,dk30344510的圖案及第二匹配輸出CVR-nr.應該是/ Tlf.作爲前綴,62226420爲圖案

+0

你停泊在字符串啓動該模式,是真的你只是在字符串開始尋找匹配? –

+0

這就是你想要的['(。*?)(?<!\ d | \ d)((?i:dk)?(?:\ d {2} \ D?){3} \ d {2 }(?!\ d))'](https://regex101.com/r/zG6yQ4/1)? – revo

+0

@revo看起來像它..你做了什麼? :) – clarkk

回答

2

你的正則表達式不輸出預期的結果,因爲你有一個字符串錨點^的開始和貪婪點.*。這意味着它只從一個字符串的開始處開始,並僅結束一次成功的匹配。

解決方案

正則表達式:

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

我並不適用於你的主正則表達式許多變化。我所做的是減少重複模式\d{2}\D?並用字界\b代替代碼。

Live demo

+0

'(。*?)'表示它是不確定的,並且如果可能的話將匹配任何模式? – clarkk

+0

它是不貪婪的,並儘可能少地使用字符,直到在正則表達式中更接近下一個模式。 – revo

0

你可以試試這個與optionn 'G' 獲得多個resultes

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

demo