2016-11-24 88 views
1

概念正則表達式與多個條件分組

Example: 0232699980132 
0 232 699980132 
0 - segment 1 
232 - segment 2 (length = 3) 
699980132 - segment 3 (length = 9) 
Length of segment 2 and 3 should be 12 or 13 

釷例如有3個路段,第一區段可以是0或24或0024. 第二區段是232或它的罐123或3434第三區段可以是任何號,但第二和第三分段的組合應該是12或13。

我試圖

/[?:0|24|0024]{1,3}[232|123|3434]{3,4}[0-9]{9}$/ 

問題:它正在工作,如果我修復第三段爲min 9,但我有第2和第3段限制在12個或13

我也試圖讓組,但它是搞亂所有

/[?:0|24|0024]{1,3}([232|123|3434]{3,4}[0-9])(?=.{14}$)$/ 

請指教。

https://jsfiddle.net/ohz7nnz7/

+0

嘗試分組構造,'(。 ..)',而不是字符類,'[...]'。見['^(0 | 24 | 0024)(232 | 123 | 3434)([0-9] {9})$'](https://regex101.com/r/JBMh4t/1) –

+0

你的意思是,每個分段2的值將是單獨的構造? – Mac

+0

如何計算段2和段3的長度是12還是13? – Mac

回答

1
我建議使用2種不同的模式,一個用來測試,另一個用於提取

var patt_test = /^(0024|24|0)(232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9})$/; 

這一個將確保我們只匹配符合條件的字符串。詳細信息:

  • ^串-start
  • (0024|24|0) - 第1組配套0024240(可縮短爲((?:00)?24|0)
  • (232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9})(不是一個字符類作爲您的問題!) - 集團2捕獲:
    • 232[0-9]{9,10} - 232號碼,然後9或10位數字
    • 123[0-9]{9,10} - 123號碼,然後9個或10位數字
    • 3434[0-9]{9} - 3434號碼,然後9位數字
  • $ - 字符串的結尾。

一旦字符串被驗證了這種方法,我們可以繼續進行提取3個部分:

var patt_extract = /^(0024|24|0)(232|123|3434)(\d{9,10})$/; 

詳情:

  • ^(0024|24|0) - 002424,或0在開始字符串
  • (232|123|3434) - 第2組捕獲232,123個或3434字面char序列
  • (\d{9,10}) - 組3:任何9至10位數字
  • $ - 串的端

var number = []; 
 
number[0] = "0232699980132"; // this should be true as starts with 0 
 
number[1] = "008973343430145"; // false 
 
number[2] = "24232667870167"; // true 
 
number[3] = "0024232656880187"; // true 
 
number[4] = "024232623432190"; // this should be false because middle segment 24 is not allowed 
 
number[5] = "02326568801878"; // this should be true 
 

 
console.clear(); 
 
var patt_test = /^(0024|24|0)(232[0-9]{9,10}|123[0-9]{9,10}|3434[0-9]{9})$/; 
 
var patt_extract = /^(0024|24|0)(232|123|3434)(\d{9,10})$/; 
 
var result = false; 
 
for(i=0; i<=(number.length-1); i++) { 
 
\t result = patt_test.test(number[i]); 
 
    if (result) { // VALIDATE THE STRING 
 
    \t var first, second, third; 
 
    \t var m = patt_extract.exec(number[i]); // EXTRACT PARTS 
 
    \t if (m) { first = m[1]; second = m[2]; third = m[3]; } 
 
    \t var str = number[i]+" -- "+result+"--"+number[i].length+"--P1:"+first+"--P2:"+second+"--P3:"+third; 
 
    \t console.log(str); 
 
    } else { 
 
    console.log(number[i]+" -- "+result+"--"+number[i].length); 
 
    } 
 
}

0

怎麼樣:

^(?:0024|24|0)(?=(?:232|123)\d{10}$)(?=3434(?:\d{9})$) 

^(?:0024|24|0)(?:(?:232|123)\d{10}|3434(?:\d{9}))$ 
+0

不,它不工作。 https://jsfiddle.net/ohz7nnz7/2/ – Mac

+0

無論如何要得到段2和段3的長度? – Mac