Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.02.2021, 17:31
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

Как преобразовать строку в массив?
Есть входящая строка, представляет собой маску номера телефона:
+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 в 17:40.
Ответить с цитированием
  #2 (permalink)  
Старый 28.02.2021, 18:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,447

Янковиц,
<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>
Ответить с цитированием
  #3 (permalink)  
Старый 28.02.2021, 18:53
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

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

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

Последний раз редактировалось Янковиц, 28.02.2021 в 18:56.
Ответить с цитированием
  #4 (permalink)  
Старый 28.02.2021, 18:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,447

Янковиц,
а проверить самостоятельно и если это не так, привести примеры, что на в ходе и что на выходе.
Ответить с цитированием
  #5 (permalink)  
Старый 28.02.2021, 19:00
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

Да, вот проверяю, действительно, с входящими данными работает. Спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 28.02.2021, 19:03
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

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

Я если честно, не очень понимаю, что в ней происходит
Ответить с цитированием
  #7 (permalink)  
Старый 28.02.2021, 19:28
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

Спасибо, разобрался.
Ответить с цитированием
  #8 (permalink)  
Старый 28.02.2021, 19:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,447

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

if () {

 } else if() {

 } else {

 }
Ответить с цитированием
  #9 (permalink)  
Старый 28.02.2021, 19:41
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 396

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


Такая же история, если есть другие символы, например: 000.000,000a000
Ответить с цитированием
  #10 (permalink)  
Старый 28.02.2021, 20:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,447

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно методом ajax вернуть ассоциативный массив js? Hurray AJAX и COMET 2 08.01.2016 23:19
Как преобразовать строку в объект axmed2004 Общие вопросы Javascript 4 20.11.2012 14:02
Массив как часть параметра diprom Javascript под браузер 3 20.09.2011 23:08
как найти и удалить массив из массива? FRIE Общие вопросы Javascript 8 14.03.2011 14:48
Как обрезать строку и добавить символы в середине, в зависимости от длинны строки andreyua Firefox/Mozilla 12 10.12.2010 14:44