2017-09-04 53 views
0

任何人都可以請告訴我如何編寫PCRE正則表達式,其中包含9個數字和字符串可以包含單個數字的最大5個副本。我找不到複製約束。PCRE regex限制重複

我在SAS

data regexp; 
    if _n_=1 then pattern=prxparse("~^(48|0|48|0048|)+[1-9]{1}+[0-9]{8}~o"); 
    retain pattern; 
    set new; 
    if prxmatch(pattern,nr_tel) then flg=1; else flg=0; 
run; 

使用Perl的正則表達式,謝謝。更多: 我想獲得9位數前綴48或無前綴。 (48 | 0 | 48 | 0048 |)這部分不適用於無前綴。

+0

請加上通過/失敗的例子 – dawg

+0

這不是Perl代碼。請[編輯]你的問題以標記正確的語言。 – amon

+0

模式應該匹配的不完全清楚,但是正則表達式匹配可能不是解決這個問題的最好方法。 – ikegami

回答

1
  1. 您需要^$這樣的長度具有意義錨兩端。
  2. 向前看(?!.*?(\d)(.*?\1){5,})斷言不超過5個相同的數字。
  3. 比賽\d{9}比賽9位數字。

所以:

/^(?!.*?(\d)(.*?\1){5,})\d{9}$/ 

做的。

Demo

正如評論指出的那樣 - 感謝Bart煮布鍋爲完善排除模式,它可以是(?!.*?(\d)(.*?\1){5})但這只是稍快。


如果你想要一個可選的前綴,你會怎麼做:

/^(?!.*?(\d)(.*?\1){5,})(?:048|48)?\d{9}$/ 

Demo

+0

' {5,}'可以只是'{5}',除此之外,現貨! :) –

+0

@BartKiers:感謝你順便說一句。我一直在努力向前看,直到你添加了'?' – dawg

+0

謝謝你,我發現它很有用。順便說一句。你知道如何把48 |或048或開頭什麼都沒有(#48 | 048 |)不起作用。 –