我正在尝试使用Regex来检查某个号码是否是有效的法语电话号码。
必须是这样的:
+33 X XX XX XX XX
或:
/^(\+33\s[1-9]{8})|(0[1-9]\s{8})$/
这是我实施的,但它错了......
typeAndWait
答案 0 :(得分:18)
您可以使用:
^
(?:(?:\+|00)33|0) # Dialing code
\s*[1-9] # First number (from 1 to 9)
(?:[\s.-]*\d{2}){4} # End of the phone number
$
请参阅demo
它允许空格或.
或-
作为分隔符,或者根本不允许使用分隔符
答案 1 :(得分:7)
一个复杂的例子(我正在使用的那个):
^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$
例如,它匹配以下每一行:
0123456789
01 23 45 67 89
01.23.45.67.89
0123 45.67.89
0033 123-456-789
+33-1.23.45.67.89
+33 - 123 456 789
+33(0) 123 456 789
+33 (0)123 45 67 89
+33 (0)1 2345-6789
+33(0) - 123456789
更多:
答案 2 :(得分:2)
var phoneExp = /^((\+)33|0|0033)[1-9](\d{2}){4}$/g;
它还考虑了0033情景。
答案 3 :(得分:1)
试试这个:
/^(\+33 |0)[1-9]( \d\d){4}$/
答案 4 :(得分:1)
将正则表达式分成两个独立的部分:
前缀可以是+33 X
或0X
数字的其余部分(XX XX XX XX
)
正则表达式将是:
^((?:\+33\s|0)[1-9](?:\s\d{2}){4})$
^ non-capturing group for prefix
^ non-capturing group for number
( )
^ actual capture group from your original regex
这只允许空格作为分隔符;如果你想要更开放的东西,Thomas Ayoub's answer更加冗长。
注意:
根据Thomas的评论,由于正则表达式是使用开始和结束标记(^$
)的完全匹配,因此捕获组是不必要的。然后你可以把它拿出来看起来像这样:
^(?:\+33\s|0)[1-9](?:\s\d{2}){4}$
它应该可以正常工作。
答案 5 :(得分:0)
RegEx格式: 0X XX XX XX XX +33 X XX XX XX XX
^(0|\+33 )[1-9]([-. ]?[0-9]{2} ){3}([-. ]?[0-9]{2})$
答案 6 :(得分:0)
我知道自提出问题以来已有很长时间了,但是我在那篇文章中尝试了几种解决方案。他们中没有一个人满足我的要求,因此我想出了这个自定义/繁重的代码,它可以处理法国号码(我认为是任何格式)以及比利时的电话号码。
def phone_pattern():
"""
\+\d{2}[-.\s]?(?:\(0\)|0)*?[-.\s]? # Dialing code +CC00(0) or +CC00 or +CC00 0
00[-.\s]?\d{2}[-.\s]?(?:\(0\)|0)*?[-.\s]? # Dialing code 0033 \(0)|0
(?:\(0\)|0|)\d?[-.\s]? # First number (from 1 to 9) preceeded by a non mandatory 0 or (0)
(?:\d{2}[-.\s]?){3,4}) # End of the phone number (3 or 4 times 2 following digits separated or not by .- )
(?:$|\D) # Anything but a number or the end of string
:return:
"""
# To be improved to make the 0 mandatory when +33 or 00 is missing. Ex it will match 234558899
# return re.compile('((?:\+\d{2}|00[-.\s]?\d{2})?[-.\s]?(?:\(0\)|0|)\d?[-.\s]?(?:\d{2}[-.\s]?){3,4})')
# This version should tka
return re.compile('((?:\+\d{2}[-.\s]?(?:\(0\)|0)*?[-.\s]?|00[-.\s]?\d{2}[-.\s]?(?:\(0\)|0)*?[-.\s]?|0)\d?[-.\s]?(?:\d{2}[-.\s]?){3,4})(?:$|\D)')
答案 7 :(得分:0)
在基于Java的应用程序中,您可以使用此依赖关系来验证电话号码:
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
</dependency>
使用示例:
public static boolean isValidFrenchPhone(String portalPhone) {
try {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
Phonenumber.PhoneNumber number = phoneUtil.parse(portalPhone, "FR");
return phoneUtil.isValidNumberForRegion(number, "FR");
} catch(Exception e) {
return false;
}
}
答案 8 :(得分:0)
+33 仅适用于法国本土。 我想你也可以添加海外法国
/^(?:(?:\+|00|0)((262|692)|(263|693)|508|(5|6)90|(5|6)94|(5|6|7)96|681|687|689))(?:[\s.-]*\d{2}){3,4}$/
如果您考虑海外地区之间的数字长度差异以及某些特定的手机区号,则正则表达式会变得非常混乱...
我目前在 JS 中使用的函数:
export const isValidFrenchPhoneNumber = (phonenumber) => {
const metropolitanFranceReg = new RegExp(/^(?:(?:\+|00)33|0)\s*[1-9](?:[\s.-]*\d{2}){4}$/)
const overseasFranceReg = new RegExp(/^(?:(?:\+|00|0)((262|692)|(263|693)|508|(5|6)90|(5|6)94|(5|6|7)96|681|687|689))(?:[\s.-]*\d{2}){3,4}$/)
// src: https://en.wikipedia.org/wiki/Telephone_numbers_in_France
// 262, 263 = La Réunion, Mayotte and IO territories ; 508 = Saint-Pierre-et-Miquelon
// 590 = Guadeloupe, Saint-Martin et Saint-Barthélemy ; 594 = French Guiana (Guyane) ; 596 = Martinique
// 681 = Wallis-et-Futuna ; 687 = Nouvelle-Calédonie
// 689 = French Polynesia
return !(phonenumber.match(metropolitanFranceReg) === null) || !(phonenumber.match(overseasFranceReg) === null)
}