2016-11-24 3 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. Третий сегмент может быть любой номер, но сочетание 2-го и 3-го сегмента должен быть 12 или 13.

Я попытался

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

Проблема: Она работает, если я фиксирую 3-й сегмент мин 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

do u означает , каждое значение сегмента 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 (а не класс персонажа, как в вашем вопросе!) Соответствие 0024, 24 или 0 (может быть укорочен ((?: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) - 0024, 24 или 0 в начале от стружки
  • (232|123|3434) - Группа 2 захват 232, 123 или 3434буквенных последовательностей символьных
  • (\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

Смежные вопросы