जावास्क्रिप्ट में एक अमेरिकी फोन नंबर को पुन: स्वरूपित करने के लिए नियमित अभिव्यक्ति


98

मैं जावास्क्रिप्ट में प्रदर्शित करने के लिए एक फोन नंबर को पुन: स्वरूपित कर रहा हूं (प्रतिस्थापित करें, मान्य नहीं है - सत्यापन के लिए कई संदर्भ हैं)। यहाँ कुछ आंकड़ों का एक उदाहरण दिया गया है:

  • 1 2 3 4 5 6 7 8 9 0
  • (123) 456-7890
  • (123)456-7890
  • 1 2 3 4 5 6 7 8 9 0
  • 123.456.7890
  • (खाली / नल)
  • 1 2 3 4 5 6 7 8 9 0

क्या ऐसा करने के लिए एक नियमित अभिव्यक्ति का उपयोग करने का एक आसान तरीका है? मैं ऐसा करने का सबसे अच्छा तरीका ढूंढ रहा हूं। क्या कोई बेहतर तरीका है?

मैं निम्नलिखित के लिए संख्या में सुधार करना चाहता हूं: (123) 456-7890


3
और उनमें से कौन सा आपका लक्ष्य प्रारूप है?
हेल ​​डेग

यह एक: (123) 456-7890
मैट के

3
मैं कहता हूँ कि सभी गैर-अंकीय वर्णों को केवल पट्टी करें और फिर तीन सबस्ट्रिंग लें
वाइजग्यू

2
@ Kindguy कृपया जवाब के रूप में (उदाहरण के साथ) पोस्ट करें, क्योंकि ओपी वास्तव में क्या करना चाहिए।
ब्रायन Driscoll 14

1
आपको यह भी निर्दिष्ट करने की आवश्यकता है कि स्वीकृत प्रारूप में से प्रत्येक कैसे लक्ष्य प्रारूप में मैप करता है, जो कि स्पष्ट नहीं है यदि इनपुट शून्य है। जब तक आप उस मामले को बाहर निकालने के लिए एक अतिरिक्त सशर्त का उपयोग करने के लिए तैयार नहीं होते हैं।
जॉन

जवाबों:


242

मान लें कि आप प्रारूप " (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"

2
उत्तम; धन्यवाद! हालाँकि, मैं इस फ़ंक्शन को जोड़ने के बाद बदल return (!m) ? nullगया return (!m) ? ""
मैट के

2
किसी समस्या से निपटने के तरीके में एक अच्छा सबक। मैं यह सोचने की कोशिश कर रहा था कि सभी संभावित मामलों का मिलान कैसे किया जाए - आप अप्रासंगिक को खत्म करें और देखें कि क्या कोई मैच है। बहुत अच्छा।
जेकेले

2
FYI करें इस तरह + 1555-555-5555 संख्या के लिए काम नहीं करता है
विल

'' + phoneNumberStringके रूप में ही है phoneNumberString... यह पहले से ही एक स्ट्रिंग है।
युंगगुन 19

@YungGun जब तक कोई एक नंबर के साथ फ़ंक्शन को कॉल नहीं करता है, जैसेformatPhoneNumber(8001231234)
मैरिक्स

32

संभावित समाधान:

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

27

var x = '301.474.4062';
    
x = x.replace(/\D+/g, '')
     .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');

alert(x);


1
धन्यवाद शॉन, मुझे आपका छोटा सरल इनलाइन समाधान पसंद है।
user752746

1
इसके लिए धन्यवाद! मैंने इसे x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');फोन नंबर के सामने '+1' जोड़ने के लिए काम करने के लिए बदल दिया
ग्रेग ए

धन्यवाद! यह सिर्फ मेरी जरूरत है
अल्बर्ट हिडाल्गो

8

यह उत्तर मैरिकिक्स के उत्तर से उधार लेता है। यह मुख्य रूप से भिन्न है कि यह आंशिक रूप से दर्ज किए गए फोन नंबर को स्वीकार करता है और उन हिस्सों को प्रारूपित करता है जो दर्ज किए गए हैं।

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

स्रोत पोस्टर से वांछित प्रारूप में जोड़कर, यह आपके टाइप करने का काम करता है। खोज के 1.5 घंटे बाद, मुझे खुशी है कि मैंने यह कोशिश की!
फंगसुन्थ्राक्स

मैंने क्षेत्र कोड के चारों ओर कोष्ठक जोड़े यदि वह मदद करता है:(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
पीटर हॉलिंग्सवर्थ

वास्तव में समस्या यह है कि आप '-' या स्पेस को मिड-स्ट्रिंग पर बैकस्पेस नहीं दे सकते। जब उपयोगकर्ता बैकस्पेसिंग कर रहा होता है, तो आपको रिफॉर्मेटिंग को रोकने की आवश्यकता होती है (जैसे newstring.length < oldstring.lengthकि कर्सर की स्थिति पर नज़र रखने के लिए और यह पता लगाने के लिए कि उपयोगकर्ता ने उन सीमांकक के ऊपर बैकस्पॉस किया है जैसेif (cursorPosition === 4 && numericString.length > 3)
पीटर हॉलिंगवर्थ

अपने प्रतिक्रिया कोड में मुझे आंतरिक रूप से केवल दर्ज की गई संख्या को संग्रहीत करना और फिर फ़ील्ड में रखा गया फ़ॉर्मेट करके इसके चारों ओर मिलता है। इसलिए बैकस्पेस वास्तविक मूल्य में पिछले चरित्र को हटाता है, न कि प्रदर्शित मूल्य।
डेविड बैकुम

5

मैं इस फ़ंक्शन का उपयोग अमेरिकी संख्याओं को प्रारूपित करने के लिए कर रहा हूं।

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 के मानक रूप में स्वरूपित किया गया है


3

पीछे की ओर सोचना

केवल पहले "1" को अनदेखा करते हुए अंतिम अंक (10 तक) लें।

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

1
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

1

जब उपयोगकर्ता विशेष रूप से स्ट्रिंग के बीच से, सीमांकक पर बैकस्पेस करने की कोशिश करता है, तो इनमें से लगभग सभी मुद्दे होते हैं।

यहां एक 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 = '';        
    }
})

0

यहां एक ऐसा है जो एक्सटेंशन के साथ फोन नंबर और फोन नंबर दोनों को स्वीकार करेगा।

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

0

आप मान्य फ़ोन नंबरों की जांच करने और उन्हें सामान्य करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं:

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;
}

0

मैंने डेविड बाउकम के उत्तर को विस्तार दिया है जिसमें लंबाई में 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;

0

ऊपर दिए गए समाधान बेहतर हैं, खासकर अगर जावा का उपयोग कर रहे हैं, और 10 से अधिक अंकों के साथ अधिक संख्याओं का सामना कर रहे हैं जैसे कि अंतर्राष्ट्रीय कोड उपसर्ग या अन्य एक्सटेंशन नंबर। यह समाधान बुनियादी है (मैं रेगेक्स की दुनिया में एक शुरुआत हूं) और यूएस फोन नंबरों को ध्यान में रखकर बनाया गया है और यह केवल 10 नंबरों वाले स्ट्रिंग्स के लिए उपयोगी है, जिसमें शायद कुछ फॉर्मेटिंग कैरेक्टर हैं, या शायद कोई भी फॉरमेटिंग कैरेक्टर नहीं हैं (सिर्फ 10 नंबर )। जैसे कि मैं केवल अर्ध-स्वचालित अनुप्रयोगों के लिए इस समाधान को पुनः प्राप्त करूंगा। मैं व्यक्तिगत रूप से वर्णों को फ़ॉर्मेट किए बिना केवल 10 नंबरों के रूप में संख्याओं को संग्रहीत करना पसंद करता हूं, लेकिन सामान्य रूप से सामान्य लोगों और एप्लिकेशन / फोन को पहचानने के लिए फोन नंबर को मानक प्रारूप में बदलने या साफ करने में सक्षम होना चाहते हैं।

मैं इस पोस्ट के पार आया, जिसे मैं एक टेक्स्ट क्लीनर ऐप के साथ उपयोग कर सकता था जिसमें PCRE Regex क्षमताएं हैं (लेकिन कोई जावा फ़ंक्शन नहीं है)। मैं यहां उन लोगों के लिए पोस्ट करूंगा जो एक सरल शुद्ध रेगेक्स समाधान का उपयोग कर सकते थे जो विभिन्न प्रकार के पाठ संपादकों, क्लीनर, विस्तारकों या यहां तक ​​कि कुछ क्लिपबोर्ड प्रबंधकों में काम कर सकते थे। मैं व्यक्तिगत रूप से उदात्त और TextSoap का उपयोग करता हूं। यह समाधान टेक्स्ट साबुन के लिए बनाया गया था क्योंकि यह मेनू बार में रहता है और एक ड्रॉप-डाउन मेनू प्रदान करता है जहां आप कर्सर द्वारा या क्लिपबोर्ड में क्या चुना जाता है, इस पर पाठ हेरफेर क्रियाओं को ट्रिगर कर सकते हैं।

मेरा दृष्टिकोण अनिवार्य रूप से दो प्रतिस्थापन / खोज है और रेगीक्स को प्रतिस्थापित करता है। प्रत्येक प्रतिस्थापन खोज और प्रतिस्थापित में दो रेगेक्स शामिल हैं, एक खोज के लिए और एक प्रतिस्थापन के लिए।

प्रतिस्थापन / खोज और बदलें # 1

  • पहले प्रतिस्थापन / खोज और स्ट्रिप्स नॉन-न्यूमेरिक नंबरों को एक 10-अंकीय संख्या से 10-अंकीय स्ट्रिंग में बदलें।

पहला प्रतिस्थापन / खोज Rexx:\D

  • यह खोज स्ट्रिंग उन सभी वर्णों से मेल खाती है जो एक अंक नहीं है।

पहला प्रतिस्थापन / Regex बदलें : "" (कुछ भी नहीं, एक जगह भी नहीं)

  • स्थानापन्न फ़ील्ड को पूरी तरह से खाली छोड़ दें, रिक्त स्थान सहित कोई भी सफेद स्थान मौजूद नहीं होना चाहिए। इसके परिणामस्वरूप सभी मिलान किए गए गैर-अंक वर्ण हटा दिए जाएंगे। आपको इस ऑपरेशन से पहले 10 अंकों + फ़ॉर्मेटिंग वर्णों के साथ जाना चाहिए और 10 अंकों वाले फ़ॉर्मेटिंग वर्णों के साथ बाहर आना चाहिए।

प्रतिस्थापन / खोज और बदलें # 2

  • दूसरा प्रतिस्थापन / खोज और ऑपरेशन के खोज भाग को क्षेत्र कोड $1, तीन संख्याओं के दूसरे सेट के लिए एक कैप्चर समूह $2और चार संख्याओं के अंतिम सेट के लिए अंतिम कैप्चर समूह के लिए कैप्चर करता है $3। ऑपरेशन के स्थानापन्न हिस्से के लिए regex अंकों के कैप्चर किए गए समूह के बीच यूएस फोन नंबर फॉर्मेटिंग सम्मिलित करता है।

दूसरा प्रतिस्थापन / खोज Rexx:(\d{3})(\d{3})(\d{4})

दूसरा प्रतिस्थापन / Regex बदलें :\($1\) $2\-$3

  • बैकस्लैश \विशेष वर्ण निकल जाता है (, ), (<-whitespace), और -के बाद से हम कैप्चर समूहों में हमारे पर कब्जा कर लिया संख्याओं के बीच उन्हें डालने कर रहे हैं $1, $2, और $3अमेरिका फोन नंबर स्वरूपण प्रयोजनों के लिए।

  • TextSoap में मैंने एक कस्टम क्लीनर बनाया जिसमें दो प्रतिस्थापन ऑपरेशन क्रियाएं शामिल हैं, इसलिए व्यवहार में यह स्क्रिप्ट को निष्पादित करने के लिए समान लगता है। मुझे यकीन है कि इस समाधान में सुधार किया जा सकता है लेकिन मुझे उम्मीद है कि जटिलता काफी बढ़ जाएगी। इस समाधान के एक उन्नत संस्करण को एक सीखने के अनुभव के रूप में स्वागत किया जाता है यदि कोई भी इसे जोड़ना चाहता है।


-2

यूएस फोन नंबरों के लिए

/^\(?(\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

    संदर्भ:

http://www.zparacha.com/phone_number_regex/


1
अन्य वेबसाइटों से सामान की प्रतिलिपि बनाना और फिर लिंक को पोस्ट न करना भी बहुत बुरा व्यवहार है: zparacha.com/phone_number_regex
तक हेल

1
मुझे खेद है, मुझे नहीं पता था कि हमें लिंक पोस्ट करना है। मुझे लगा कि हमें केवल पोस्ट किए गए प्रश्नों के उत्तर देने होंगे।
Bebu

5
यह है कभी नहीं अपने खुद की तरह एक और किसी के काम देखो बनाने के लिए ठीक। इसे अगली बार याद रखें कि लिंक पोस्ट करने में कुछ भी गलत नहीं है, लेकिन कॉपी करना (विशेषकर लिंक उपलब्ध कराए बिना) नहीं है। और आपके पास हमेशा अपना उत्तर संपादित करने का विकल्प होता है।
तक Helge

डाउनवोट किया गया क्योंकि लेखक ने जवाब नहीं दिया कि लेखक द्वारा अनुरोध किए गए फोन नंबर को कैसे बदला जाए।
ब्रायनएचवीबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.