@YanAlexandrov
Чайник со стажем

Как разобрать строку?

Есть входящая строка, представляет собой маску, например номера телефона (может быть совершенно любой):
+1({/[1-9]/}00) 000 000{/[1-9]/}

Нужно перебрать строку таким образом, чтобы получился массив:
['+', '1', '(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /[1-9]/]


1. 0 преобразует в регулярку /\d/
2. Всё что между символами "{}" сохранял "как есть", но группировал как 1 элемент массива (при этом фигурные скобки не сохраняются).
3. Всё остальное тоже сохранял как есть.

Вот что пока есть:
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 );
	}
});

Проблема именно с парсингом того, что между фигурными скобками. И да, маска может быть совершенно иной, не только номер телефона.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
RAX7
@RAX7
function parse(str) {
  const result = [];
  let openBrackets = 0;
  let regExpString = "";

  for (let i = 0; i < str.length; i++) {
    const char = str[i];

    if (char === "{") {
      openBrackets++;
      if (openBrackets === 1) {
        continue;
      }
    }
    else if (char === "}") {
      openBrackets--;

      if (openBrackets === 0) {
        regExpString = regExpString.replace(/(^\/)|(\/$)/g, "");
        result.push(new RegExp(regExpString));
        regExpString = "";
        continue;
      }
    }

    if (openBrackets === 0) {
      switch (char) {
        case "0": {
          result.push(/\d/);
          break;
        }
        default: {
          result.push(char);
        }
      }
    }
    else {
      regExpString += char;
    }
  }

  return result;
}

const str = "+1({/[1-9]/}00) 000 000{/[1-9]/}";
const r = parse(str);
console.log(r); // -> ["+", "1", "(", /[1-9]/, /\d/, /\d/, ")", " ", /\d/, /\d/, /\d/, " ", /\d/, /\d/, /\d/, /[1-9]/]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы