Как преобразовать строку по шаблону в JS?

программирование JavaScript регулярные выражения

Есть номера телефонов в формате +79111231212. Нужно превратить эту строку в +7 911 123-12-12. Пока пробую с помощью регулярки. Примерно так: str.replace(/(..)(...)(...)(..)(..)/g,"$1 $2 $3-$4-$5"), но ничего не выходит. Такое, вообще, можно сделать регуляркой? И как?

Примечание:
Работает такая штука: str.replace(/([0-9]{1})([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})/g,"$1 $2 $3-$4-$5"), но она работает только, если в номере все цифры. Было бы хорошо сделать так, чтобы форматирование работала для номера любой длины

Примечание:
Crazyzubr, отличное решение! Правда, на практике есть нюансы: затирает первые цифры, если ввести цифр больше чем нужно; не дает написать + в первой позиции, а в конце ввода сам его дописывает, хотя логично предполагать, что если пользователь вводит номер с +, то он уже собирается его вводить в международном формате. Но сам подход интересен! Буду копать)

Примечание:
Кстати. Пока я это делаю так:

str = str.replace(/^[^\+\d]|([\+\d])\D/g,"$1");

var strlen = str.replace("+","").length;
if (strlen < 2) {
str = str.replace(/([0-9]{0,1})/g,"$1");
} else if (strlen < 5) {
str = str.replace(/([0-9]{1})([0-9]{0,3})/g,"$1 $2");
} else if (strlen < 8) {
str = str.replace(/([0-9]{1})([0-9]{3})([0-9]{0,3})/g,"$1 $2 $3");
} else if (strlen < 10) {
str = str.replace(/([0-9]{1})([0-9]{3})([0-9]{3})([0-9]{0,2})/g,"$1 $2 $3-$4");
} else if (strlen < 12) {
str = str.replace(/([0-9]{1})([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{0,2})/g,"$1 $2 $3-$4-$5");
} else {
str = str.replace(/([0-9]{1})([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})/g,"$1 $2 $3-$4-$5");
var l = 0;
if (str.charAt(0) == "+") l = 1;
str = str.slice(0,15+l);
}

Интересно, что быстрее, использовать кучу if или прогонять через несколько регулярок?

Примечание:
Ну телефоны-то могут быть не только российские. +7 Россия, +380 Украина, + 375 Белоруссия, +1 США. С этим, вообще, все непросто: http://habrahabr.ru/post/102352/
Но для упрощения можно оставить формат +x xxx xxx-xx-xx, а в поле ввода номера сразу заполнять код страны (+7, например), чтобы пользователь представлял примерно, как писать.
Если номер начинается с плюса (что 100% соответствует международному формату), то следует сразу ожидать ввода номера из 11-12 цифр и форматирование будет происходить примерно как у меня в цикле.
Если введено 12 цифр, то можно предположить, что номер из СНГ и отформатировать как +xxx xxx xx-xx-xx, а 13 и более цифру, вообще, запрещать набирать. т.е. удалять сразу же.
Если номер начинается с цифры, то это может быть и локальный формат. Этот вариант превосходно реализован в комбайнчике! (т.е. номера форматируются так, чтобы последние цифры шли парами xx-xx)
Ответы:
str.replace(/^(\+?)([0-9]?)([0-9]{0,3})([0-9]{3})([0-9]{2})([0-9]{2})$/g,"$1$2 $3 $4-$5-$6");
вот комбайнчик, жует все - приводит к формату:  +7 911 123-12-12 или примерно такому.
>>>Правда, на практике есть нюансы:
>>>затирает первые цифры, если ввести цифр больше чем нужно;
>>>не дает написать + в первой позиции, а в конце ввода сам его дописывает, хотя логично предполагать, что если пользователь вводит номер с +, то он уже собирается его вводить в международном формате.


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.