Как преобразовать строку в массив?
Есть входящая строка, представляет собой маску номера телефона:
+1({/[1-9]/}00) 000 000{/[1-9]/} Нужно перебрать строку таким образом, чтобы получился массив: ['+', '1', '(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /[1-9]/] 0 преобразует в регулярку /\d/ Всё что между символами "{}" сохранял "как есть", но группировал как 1 элемент массива (при этом фигурные скобки не сохраняются). Всё остальное тоже сохранял как есть. Вот что пока есть: mask = '+1({/[1-9]/}00) 000 000{/[1-9]/}'; var oldMask = mask.split(''); newMask = []; oldMask.forEach(function(char) { switch( char ) { case '0': newMask.push( /\d/ ); break; default: newMask.push( char ); } }); Проблема именно с парсингом того, что между фигурными скобками. Важно. Маска может быть и совершенно иной, не только номер телефона. |
Янковиц,
<script> let f = a => /\{[^}]+?\}/.test(a); let r = a => new RegExp(a.slice(2,-2)); let reg ='+1({/[1-9]/}00) 000 000{/[1-9]/}'; reg = reg.match(/(\{[^}]+?\})|(\+)|([()])|(\d)|(\s+)/g); reg = reg.map(a => a === '0' ? /\d/ : f(a) ? r(a) : a) document.write(reg) </script> |
Спасибо, только там могут быть разные маски, не только телефона.
А, хотя нет, я правильно понимаю reg.match(/(\{[^}]+?\})|(\+)|([()])|(\d)|(\s+)/g) разбирает любую строку? |
Янковиц,
а проверить самостоятельно и если это не так, привести примеры, что на в ходе и что на выходе. |
Да, вот проверяю, действительно, с входящими данными работает. Спасибо.
|
Если не затруднит, а возможно эту строку немного проще?
reg = reg.map(a => a === '0' ? /\d/ : f(a) ? r(a) : a); Я если честно, не очень понимаю, что в ней происходит :( |
Спасибо, разобрался.
|
|
Рони, подскажи, а как изменить регулярку? У меня для маски IP адреса точки вырезает:
Вот маска, 000.000.000.000 И вот регулярка возвращает: ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"] Такая же история, если есть другие символы, например: 000.000,000a000 |
Янковиц,
а что нужно чтоб возвращалось? |
С другими символами получилось. Изменил регулярку с
reg = reg.match(/(\{[^}]+?\})|(\+)|([()])|(\d)|(\s+)/g);на reg = reg.match( /(\{[^}]+?\})|(.)/g ); Теперь из 000.000,000a000 возвращает массив какой нужно: ["0", "0", "0", ".", "0", "0", "0", ",", "0", "0", "0", "a", "0", "0", "0"] Но сейчас попробовал регулярку с вложенными фигурными скобками. Эта регулярка просто проверяет корректность российского почтового индекса. let reg = '{/^[1-6]\d{0,5}$/}'; возвращает [/^[1-6]d{0,/, "$", "/", "}"] А нужно, чтобы вернул массив, содержащий 1 элемент: [ /^[1-6]\d{0,5}$/ ] Прошу прощения, может я выбрал как разделитель не тот символ. Может надо было вместо фигурных скобок использовать что-то другое, чтобы не было конфликтов. |
Янковиц,
<script> const fun = str => { let f = a => /\{[^\s]+\}/.test(a); let r = a => new RegExp(a.slice(2,-2)); str = str.match(/(\{[^\s]+\})|(\+)|([()])|(.)|(\s+)/g); str = str.map(a => a === '0' ? /\d/ : f(a) ? r(a) : a); return str } let reg =['{/^[1-6]\d{0,5}$/}', '+1({/[1-9]/}00) 000 000{/[1-9]/}','000.000,000a000']; document.write(reg.map(fun).join('<br>')) </script> |
Спасибо большое!
|
Янковиц,
как обработать это '{/^[1-6]\d{0,5}$/}' я не знаю,или изначально нужно \\d |
Часовой пояс GMT +3, время: 11:58. |