Это не дубликат, связанный поток не объясняет, как этого добиться.
Я хочу получить номер телефона в определенном формате.
+ хх (х) ххх ххх хххх
Пользователь может ввести что угодно (но всегда должно быть число +61). Пока я пробовал следующее.
Мой вопрос - есть ли способ просто привести к одному выражению?
value = value.replace(/\D/g,'');
value = value.startsWith(0) ? value.substring(1) : value;
value = value.startsWith('610') ? value.substring(3) : value;
value = value.startsWith('61') ? value.substring(2) : value;
value = '+61 (0) ' + value.replace(/\d{3,4}?(?=...)/g, '$& ');
Вы пытаетесь создать регулярное выражение, которое проверяет номер мобильного телефона?
Возможный дубликат Комплексное регулярное выражение для проверки номера телефона
Не дубликат.
Не могли бы вы привести примеры правильного / неправильного ввода?
Вход может быть любым xgsh6101231231234vvajx, и это будет преобразовано в +61 (0) 123 123 1234
\D|^(0+|610|61) на ничто и (.{3})(.{3})(.{2})(.{2}) на +61 (0) $1 $2 $3 $4splash58 не могли бы вы объяснить свой комментарий подробнее?
splash58 все еще не уверен, что здесь происходит.
@panthro Сработал ли для вас какой-либо из предоставленных ответов?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы расширить и объяснить комментарий @ splash58, они предлагают использовать два регулярных выражения для полной замены, которую вы хотите. Первый (/\D|(0+|610|61)/gi) удалит все нежелательные символы в строке. Второй (/(\d{3})(\d{3})(\d{4})/gi) будет принимать оставшиеся цифры и фиксировать нужные группы, чтобы вы могли их отформатировать по своему усмотрению. Я настоятельно рекомендую посмотреть ссылки regex101, которые они предоставили, поскольку этот сайт полностью объяснит, как и почему данное выражение соответствует тому, что оно делает справа.
Укороченная версия:
/\D|(0+|610|61)/gi будет соответствовать любому НЕ-цифровому символу ИЛИ строке нулей, «610» или «61». Замените это ничем, чтобы удалить
/(\d{3})(\d{3})(\d{4})/gi будет соответствовать строке из 10 цифр и групп захвата, это то, что означают круглые скобки, из 3 цифр, 3 цифр и 4 цифр. При замене на них можно ссылаться как на идентификаторы $1, $2 и $3 в соответствии с их положением.
Собираем все вместе:
// look in a string and return formatted phone number only
function phone(str) {
str = str.replace(/\D|(0+|610|61)/gi, '');
str = str.replace(/(\d{3})(\d{3})(\d{4})/gi, '+61 (0) $1 $2 $3');
return str;
}
console.info(phone('xgsh6101231231234vvajx'));
console.info(phone('+6101231231234'));Я бы также рекомендовал сначала выполнить поиск по всей входной строке для ряда чисел или пробелов, чтобы получить меньше ложных срабатываний. Это можно сделать с помощью регулярного выражения типа /[\d\s]+/.
Спасибо, но приведенное выше не работает, если пользователь вводит +6101231231234 Он добавляет еще 61 в номер телефона после +61 (0) 61 ....
Только добавьте \+? в регулярное выражение
@panthro И будет лучше показать примеры ввода, который вы ожидаете
@panthro, вы уверены, что реализовали это, как показано? ввод, который вы только что предоставили, отлично подходит для меня. Я добавил к примеру, и если вы сейчас нажмете «Выполнить», вы увидите, что здесь он работает.
Вы можете сопоставить номер, используя:
^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$
И замените на:
+61 (0) $1 $2 $3
Объяснение
^ Подтвердить начало строки.*? Совпадение 0+ символов без жадности\+? Соответствует необязательному знаку плюс0*610? Совпадение 0+ раз на ноль, 61 с необязательным нулем(\d{3})(\d{3})(\d{4}) соответствует 3 группам с 3, 3 и 4 цифрами(?!\d) Отрицательный просмотр вперед, чтобы утверждать, что следующее не является цифрой.* Соответствует 0+ символов$ Подтвердить конец строкиconst strings = [
"xgsh6101231231234vvajx",
"xgsh06101231231234vvajx",
"xgsh000006101231231234vvajx",
"+6101231231234",
"xgsh61012312312345vvajx",
"xgsh5101231231234vvajx",
"xgsh00000101231231234vvajx",
"xgsh6143545626455345601231231234vvajx"
];
let pattern = /^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$/;
strings.forEach((s) => {
console.info(s.replace(pattern, "+61 (0) $1 $2 $3"));
});
Извините, JS - был долгий день!