Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как преобразовать строку в массив? (https://javascript.ru/forum/dom-window/82008-kak-preobrazovat-stroku-v-massiv.html)

Янковиц 28.02.2021 18:31

Как преобразовать строку в массив?
 
Есть входящая строка, представляет собой маску номера телефона:
+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 );
	}
});


Проблема именно с парсингом того, что между фигурными скобками. Важно. Маска может быть и совершенно иной, не только номер телефона.

рони 28.02.2021 19:35

Янковиц,
<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>

Янковиц 28.02.2021 19:53

Спасибо, только там могут быть разные маски, не только телефона.

А, хотя нет, я правильно понимаю reg.match(/(\{[^}]+?\})|(\+)|([()])|(\d)|(\s+)/g) разбирает любую строку?

рони 28.02.2021 19:59

Янковиц,
а проверить самостоятельно и если это не так, привести примеры, что на в ходе и что на выходе.

Янковиц 28.02.2021 20:00

Да, вот проверяю, действительно, с входящими данными работает. Спасибо.

Янковиц 28.02.2021 20:03

Если не затруднит, а возможно эту строку немного проще?
reg = reg.map(a => a === '0' ? /\d/ : f(a) ? r(a) :  a);

Я если честно, не очень понимаю, что в ней происходит :(

Янковиц 28.02.2021 20:28

Спасибо, разобрался.

рони 28.02.2021 20:31

Янковиц,
Условный оператор „?“
тоже самое что

if () {

 } else if() {

 } else {

 }

Янковиц 28.02.2021 20:41

Рони, подскажи, а как изменить регулярку? У меня для маски IP адреса точки вырезает:
Вот маска, 000.000.000.000
И вот регулярка возвращает:
["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]


Такая же история, если есть другие символы, например: 000.000,000a000

рони 28.02.2021 21:55

Янковиц,
а что нужно чтоб возвращалось?

Янковиц 01.03.2021 10:40

С другими символами получилось. Изменил регулярку с
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}$/ ]


Прошу прощения, может я выбрал как разделитель не тот символ. Может надо было вместо фигурных скобок использовать что-то другое, чтобы не было конфликтов.

рони 01.03.2021 11:16

Янковиц,
<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>

Янковиц 01.03.2021 11:26

Спасибо большое!

рони 01.03.2021 14:18

Янковиц,
как обработать это '{/^[1-6]\d{0,5}$/}' я не знаю,или изначально нужно \\d


Часовой пояс GMT +3, время: 11:58.