巴西电话号码的正则表达式

4
我试图为用户设置一个正则表达式验证,以输入巴西电话号码。我需要它接受(或尽可能接近)以下格式:22-22222-2222 22222222222 (22) 22222 2222 (22)-22222-2222 22 22222 2222 (22)222222222。因此,它只能接受数字、空格、破折号和括号。如有任何建议,将不胜感激!

1
以加号开头怎么办?你的代码是什么?你试图如何完成这个任务? - BladeMight
不,我认为我们在开头不需要“+”符号。我目前使用JavaScript验证输入以满足某些验证。如果未满足验证,则文本框变红,并且“提交”按钮变灰。目前,它具有仅允许数字值的正则表达式,但问题是当人们尝试添加自己的符号、短划线和括号时,JavaScript验证仍然使文本框变红,这似乎会让人困惑。 - J33NO
然后你应该改变你的正则表达式,不仅接受数字值,试试这个:\(?\d{2,}\)?[ -]?\d{4,}[\-\s]?\d{4},同时检查你的Javascript是否在某些事件中持续检查格式,例如在<input onchange="yourcheck_function()">或者input.oninput = function(){} - BladeMight
7个回答

6

我刚刚制作了一个适用于巴西号码的有效正则表达式:

^\s*(\d{2}|\d{0})[-. ]?(\d{5}|\d{4})[-. ]?(\d{4})[-. ]?\s*$

请查看在https://regex101.com/r/safMl7/2的验证。

由于我们知道号码来自巴西: +55,因此不会获取国家代码。

以下示例可以正常工作,无论是否有空格和破折号:

  • 12 1234 1234
  • 12 12345 1234
  • 12345 1234
  • 1234 1234

正则表达式的每个组都将被正确分组为巴西格式。

参见此示例:62 98345 1234

See this example: 62 98345 1234


3

使用JavaScript实现巴西电话号码的掩码

11位数字格式的正则表达式:/(\d{2})(\d{1})(\d{4})(\d{4})/, "($1) $2 $3-$4

未使用正则表达式前:63991017575
应用正则表达式后:(63) 9 9101-7575

示例1:使用JavaScript

var number = '63992017738';
number = number.toString().replace(/(\d{2})(\d{1})(\d{4})(\d{4})/, "($1) $2 $3-$4")

结果:(63) 9 9201-7738


使用JavaScript的示例2:

var number = '63992017738';
number = number.toString().replace(/(\d{2})(\d{1})(\d{4})(\d{4})/, "$1 $2 $3-$4")

结果:63 9 9101-7575


JAVASCRIPT 示例3:

当前时间 + 国家代码
//if you need this: +55 (63) 9 9201-7131
var number = '5563992017131';
number = number.toString().replace(/(\d{2})(\d{2})(\d{1})(\d{4})(\d{4})/, "+$1 ($2) $3 $4-$5")

结果:+55(63)9 9201-7131



2

1

这是什么意思:\(?\d{2,}\)?[ -]?\d{4,}[\-\s]?\d{4}


1
它接受无限数量的数字。 - Dpedrinha

0

下面使用正则表达式似乎可以捕获巴西电话号码最常见的20种写法,包括固定电话和移动电话。

(\b\(\d{2}\)\s?[9]?\s?\d{4}(\-|\s)?\d\d{4})|(\b\d{2}\s?[9]?\s?\d{4}(\-|\s)?\d{4})|(\b([9]|[9]\s)?\d{4}(\-|\s)?\d{4})|(\b\d{4}(\-|\s)?\d{4})

有四个“或”选项来匹配数字。它从更复杂的选项(带括号和DDD代码)到最简单的选项(即八位电话号码)。

我在每种情况的前面而不是后面添加了\b,因为有时您可以捕获人们写一个数字后跟一些描述的情况:“99000-1100word”。您可以根据需要删除单词边界:

(\(\d{2}\)\s?[9]?\s?\d{4}(\-|\s)?\d\d{4})|(\d{2}\s?[9]?\s?\d{4}(\-|\s)?\d{4})|(([9]|[9]\s)?\d{4}(\-|\s)?\d{4})|(\d{4}(\-|\s)?\d{4})

我相信很多人可以细化这个正则表达式,并提出更优化的版本,但对于我的问题来说,它解决了一切。 - marquesine

0

这是更简单的正则表达式

10位数字格式的正则表达式:(\d{2})(\d{4})(\d{4})

11位数字格式的正则表达式:(\d{2})(\d{5})(\d{4})

因此,您可以编写一个函数来使用正则表达式进行替换:

export function phoneFormatter10(phone) {
    phone = phone.replace(/[^\d]/g, ""); //remove all non digits
    return phone.replace(/(\d{2})(\d{4})(\d{4})/, "($1)$2-$3");

}

export function phoneFormatter11(phone) {
    phone = phone.replace(/[^\d]/g, ""); //remove all non digits
    return phone.replace(/(\d{2})(\d{5})(\d{4})/, "($1)$2-$3");
}

使用示例:

phoneFormatter10('3499883424')
result: '(34)9988-3424'
phoneFormatter11('3499^883*4-244') //even with badly formatted string
result: '(34)99883-4244'

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接