Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Javascript重新格式化美国电话号码的正则表达式_Javascript_Regex - Fatal编程技术网

用Javascript重新格式化美国电话号码的正则表达式

用Javascript重新格式化美国电话号码的正则表达式,javascript,regex,Javascript,Regex,我希望重新格式化(替换,而不是验证-有很多验证参考)一个电话号码,以便在Javascript中显示。以下是一些数据的示例: 123 4567890 (123)456-7890 (123)456-7890 1234567890 123.456.7890 (空白/空) 1234567890 有没有一种简单的方法可以使用正则表达式来实现这一点?我在寻找最好的方法。有更好的办法吗 我想将号码重新格式化为以下格式:(123)456-7890用于美国电话号码 /^\(?(\d{3})\)?[- ]?(\

我希望重新格式化(替换,而不是验证-有很多验证参考)一个电话号码,以便在Javascript中显示。以下是一些数据的示例:

  • 123 4567890
  • (123)456-7890
  • (123)456-7890
  • 1234567890
  • 123.456.7890
  • (空白/空)
  • 1234567890
有没有一种简单的方法可以使用正则表达式来实现这一点?我在寻找最好的方法。有更好的办法吗

我想将号码重新格式化为以下格式:
(123)456-7890

用于美国电话号码

/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/
让我们将这个正则表达式分成更小的片段,使其易于理解

  • /^\(?
    :表示电话号码可以以可选的
    )开头
  • (\d{3})
    :可选的
    后必须有3个数字。如果电话号码没有
    ),则必须以3个数字开头。例如
    (308
    308
  • \)?
    :表示电话号码的前3位数字后面可以有一个可选的
  • [-]?
    :接下来,电话号码可以在
    之后(如果存在)或前3位数字之后有一个可选连字符(
    -
  • (\d{3})
    :然后必须再有3个数字。例如
    (308)-135
    308-135
    308135
  • [-]?
    :在第二组3位数字之后,电话号码可以有另一个可选连字符(
    -
    )。例如
    (308)-135-
    308-135-
    308135-
  • (\d{4})$/
    :最后,电话号码必须以四位数字结尾。例如
    (308)-135-7895
    308-135-7895
    308135-7895
    3081357895

    参考:


假设您需要格式“
(123)456-7890
”:

函数格式PhoneNumber(phoneNumberString){
var cleaned=(''+phoneNumberString).替换(/\D/g'');
var match=cleaned.match(/^(\d{3})(\d{3})(\d{4})$/);
如果(匹配){
返回'('+match[1]+')'+match[2]+'-'+match[3];
}
返回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"
var x='301.474.4062';
x=x。替换(/\D+/g,“”)
。取代(/(\d{3})(\d{3})(\d{4})/,“($1)$2-$3”);
警报(x);
可能的解决方案:

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

我用这个函数来格式化我们的数字

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的标准格式。这里有一个可以同时接受电话号码和带分机的电话号码的方法

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

这个答案借用了maerics的答案。它的主要区别在于它接受部分输入的电话号码,并格式化已输入的部分

phone=value.replace(/\D/g');
const match=phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
如果(匹配){
电话=`${match[1]}${match[2]?'':''''${match[2]}${match[3]?'-':''}${match[3]}';
}
回电

您可以使用此功能检查有效电话号码并将其正常化:

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;
}
反省 仅取最后一位数字(最多10位),忽略第一个“1”

键入时的输入/输出示例

formatUSNumber('+1333')
// (333)

formatUSNumber('333')
// (333)

formatUSNumber('333444')
// (333) 444

formatUSNumber('3334445555')
// (333) 444-5555
我已经扩展到支持长度不超过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正则表达式功能(但没有java函数)。我将在这里为那些可以使用简单的纯正则表达式解决方案的人发布这篇文章,该解决方案可以在各种文本编辑器、清理器、扩展器,甚至一些剪贴板管理器中工作。我个人使用Sublime和TextSoap。此解决方案是为文本Soap设计的,因为它位于菜单栏中,并提供了一个下拉菜单,您可以在其中触发文本操作关于光标选择的内容或剪贴板中的内容的操作

我的方法基本上是两个替换/搜索和替换正则表达式。每个替换搜索和替换涉及两个正则表达式,一个用于搜索,一个用于替换

替换/搜索和替换#1

  • 第一次替换/搜索和替换将非数字数字从10位数字剥离为10位字符串
第一次替换/搜索正则表达式:
\D

  • 此搜索字符串匹配所有非数字字符
第一次替换/替换正则表达式:“”(没有,甚至没有空格)

  • 将替换字段保留为空,不应存在包括空格在内的空白。这将导致删除所有匹配的非数字字符。您应该
    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;
    
    //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 = '';        
        }
    })
    
    function formatPhoneNumber(phoneNumber) {
      const cleanNum = phoneNumber.toString().replace(/\D/g, '');
      const match = cleanNum.match(/^(\d{3})(\d{0,3})(\d{0,4})$/);
      if (match) {
        return '(' + match[1] + ') ' + (match[2] ? match[2] + "-" : "") + match[3];
      }
      return cleanNum;
    }
    
    //...
    
    onChange={e => setPhoneNum(formatPhoneNumber(e.target.value))}
    
    import parsePhoneNumber from 'libphonenumber-js'
    
    const phoneNumber = parsePhoneNumber('+12133734253')
    
    phoneNumber.formatInternational() === '+1 213 373 4253'
    phoneNumber.formatNational() === '(213) 373-4253'
    phoneNumber.getURI() === 'tel:+12133734253'