我想重新格式化(替换,不验证-有许多用于验证的参考)电话号码以Java语言显示。这是一些数据的示例:
- 123 4567890
- (123)456-7890
- (123)456-7890
- 123 456 7890
- 123.456.7890
- (空白/空)
- 1234567890
是否有使用正则表达式的简便方法?我正在寻找做到这一点的最佳方法。有没有更好的办法?
我想将数字重新格式化为以下形式: (123) 456-7890
我想重新格式化(替换,不验证-有许多用于验证的参考)电话号码以Java语言显示。这是一些数据的示例:
是否有使用正则表达式的简便方法?我正在寻找做到这一点的最佳方法。有没有更好的办法?
我想将数字重新格式化为以下形式: (123) 456-7890
Answers:
假设您要使用格式“ (123) 456-7890
”:
function formatPhoneNumber(phoneNumberString) {
var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/)
if (match) {
return '(' + match[1] + ') ' + match[2] + '-' + match[3]
}
return null
}
这是允许使用可选+1
国际代码的版本:
function formatPhoneNumber(phoneNumberString) {
var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)
if (match) {
var intlCode = (match[1] ? '+1 ' : '')
return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')
}
return null
}
formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900"
formatPhoneNumber('2345678900') // => "(234) 567-8900"
return (!m) ? null
为return (!m) ? ""
。
'' + phoneNumberString
与phoneNumberString
...相同...已经是一个字符串。
formatPhoneNumber(8001231234)
可能的解决方案:
function normalize(phone) {
//normalize string and remove all unnecessary characters
phone = phone.replace(/[^\d]/g, "");
//check if number length equals to 10
if (phone.length == 10) {
//reformat and return phone number
return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
}
return null;
}
var phone = '(123)4567890';
phone = normalize(phone); //(123) 456-7890
var x = '301.474.4062';
x = x.replace(/\D+/g, '')
.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
alert(x);
x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');
在例如电话号码前工作添加“+1”
此答案是从maerics的答案中借用的。它的主要区别在于,它接受部分输入的电话号码并格式化已输入的部分。
phone = value.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
if (match) {
phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`;
}
return phone
(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
newstring.length < oldstring.length
OR跟踪光标位置并找出用户刚刚在这些分隔符上退格的时间,例如if (cursorPosition === 4 && numericString.length > 3)
我正在使用此功能来格式化美国数字。
function formatUsPhone(phone) {
var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/);
phone = phone.trim();
var results = phoneTest.exec(phone);
if (results !== null && results.length > 8) {
return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : "");
}
else {
return phone;
}
}
它接受几乎所有可以想象的写美国电话号码的方式。结果被格式化为(987)654-3210 x123的标准格式
仅忽略最后一个数字(最多10个),忽略第一个“ 1”。
function formatUSNumber(entry = '') {
const match = entry
.replace(/\D+/g, '').replace(/^1/, '')
.match(/([^\d]*\d[^\d]*){1,10}$/)[0]
const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match
const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : ''
const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : ''
return `${part1}${part2}${part3}`
}
输入时的示例输入/输出
formatUSNumber('+1333')
// (333)
formatUSNumber('333')
// (333)
formatUSNumber('333444')
// (333) 444
formatUSNumber('3334445555')
// (333) 444-5555
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits
if (numbers.length != 10) //wrong format
//handle error
var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings
这是一个可以接受电话号码和带扩展名的电话号码的地方。
function phoneNumber(tel) {
var toString = String(tel),
phoneNumber = toString.replace(/[^0-9]/g, ""),
countArrayStr = phoneNumber.split(""),
numberVar = countArrayStr.length,
closeStr = countArrayStr.join("");
if (numberVar == 10) {
var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed.
} else if (numberVar > 10) {
var howMany = closeStr.length,
subtract = (10 - howMany),
phoneBeginning = closeStr.slice(0, subtract),
phoneExtention = closeStr.slice(subtract),
disX = "x", // Change the extension symbol here
phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed.
array = [phoneBeginningReplace, disX, phoneExtention],
afterarray = array.splice(1, 0, " "),
phone = array.join("");
} else {
var phone = "invalid number US number";
}
return phone;
}
phoneNumber("1234567891"); // Your phone number here
您可以使用此功能来检查有效的电话号码并对其进行规范化:
let formatPhone = (dirtyNumber) => {
return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}
let isPhone = (phone) => {
//normalize string and remove all unnecessary characters
phone = phone.replace(/\D+/g, '');
return phone.length == 10? true : false;
}
我已经扩展了David Baucum的答案,以包括对扩展名的支持,扩展名最多为4位数字。它还包括原始问题中要求的括号。在您输入字段时,这种格式将起作用。
phone = phone.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})(\d{0,4})$/);
if (match) {
phone = `(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}${match[4] ? ' x' : ''}${match[4]}`;
}
return phone;
当用户尝试在定界符上退格时,几乎所有这些问题都存在,尤其是从字符串的中间。
这是一个可解决此问题的jquery解决方案,并确保您在编辑时光标停留在正确的位置:
//format text input as phone number (nnn) nnn-nnnn
$('.myPhoneField').on('input', function (e){
var $phoneField = e.target;
var cursorPosition = $phoneField.selectionStart;
var numericString = $phoneField.value.replace(/\D/g, '').substring(0, 10);
// let user backspace over the '-'
if (cursorPosition === 9 && numericString.length > 6) return;
// let user backspace over the ') '
if (cursorPosition === 5 && numericString.length > 3) return;
if (cursorPosition === 4 && numericString.length > 3) return;
var match = numericString.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
if (match) {
var newVal = '(' + match[1];
newVal += match[2] ? ') ' + match[2] : '';
newVal += match[3] ? '-' + match[3] : '';
// to help us put the cursor back in the right place
var delta = newVal.length - Math.min($phoneField.value.length, 14);
$phoneField.value = newVal;
$phoneField.selectionEnd = cursorPosition + delta;
} else {
$phoneField.value = '';
}
})
上面的解决方案是优越的,特别是在使用Java的情况下,遇到的数字超过10位的数字更多,例如国际代码前缀或其他扩展名。此解决方案是基本的(我是regex的初学者),并且考虑到了美国电话号码,仅适用于只有10个数字且可能带有某些格式化字符的字符串,或者根本没有格式化字符(仅10个数字) )。因此,我建议将此解决方案仅用于半自动应用程序。我个人更喜欢将数字存储为仅10个数字,而无需设置格式字符,但我也希望能够将电话号码转换或清除为普通人和应用程序/电话可以立即识别的标准格式。
我碰到了这篇文章,寻找可以与具有PCRE Regex功能(但没有Java函数)的文本清洁器应用程序一起使用的功能。我将在此处发布此文章,以供那些可以使用简单的正则表达式解决方案的人使用,该解决方案可以在各种文本编辑器,清理器,扩展器甚至某些剪贴板管理器中使用。我个人使用Sublime和TextSoap。该解决方案专为Text Soap而开发,因为它位于菜单栏中,并提供一个下拉菜单,您可以在其中针对光标选择的内容或剪贴板中的内容触发文本操作。
我的方法本质上是两个替换/搜索和替换正则表达式。每个替换搜索和替换都涉及两个正则表达式,一个用于搜索,一个用于替换。
替换/搜索和替换#1
首次替换/搜索正则表达式:\D
第一次替换/替换正则表达式:“”(什么都没有,甚至没有空格)
替换/搜索并替换#2
$1
的组,用于第二组三个数字$2
的捕获组以及用于最后一组四个数字的捕获组$3
。该操作的替代部分的正则表达式在捕获的数字组之间插入美国电话号码格式。第二替代/搜索正则表达式:(\d{3})(\d{3})(\d{4})
第二次替换/替换正则表达式:\($1\) $2\-$3
反斜杠\
转义的特殊字符(
,)
,
(<-whitespace),并且-
由于我们在捕捉组捕捉我们的数字之间插入其中$1
,$2
,和$3
美国的电话号码格式的目的。
在TextSoap中,我创建了一个包含两个替换操作动作的自定义清理器,因此在实践中,它感觉与执行脚本相同。我确信可以改进此解决方案,但我希望复杂性会大大提高。如果有人要添加此解决方案的改进版本,可以作为学习经验来欢迎。
对于美国电话号码
/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/
让我们将此正则表达式分成较小的片段以使其易于理解。
/^\(?
:表示电话号码可以以可选的开头(
。(\d{3})
:选填项后(
必须有3个数字。如果电话号码没有(
,则必须以3位数字开头。例如(308
或308
。\)?
:表示电话号码的)
前3位数字可以为可选。[- ]?
:接下来,电话号码-
后面()
如果有)或前3个数字后可以有一个可选的连字符()。(\d{3})
:然后必须再有3个数字。EG(308)-135
或308-135
或308135
[- ]?
:第二组3位数后,电话号码可以有另一个可选的连字符(-
)。EG(308)-135-
或308-135-
或308135-
(\d{4})$/
:最后,电话号码必须以四位数结尾。例如(308)-135-7895
或308-135-7895
或308135-7895
或3081357895
。
参考: