法国电话号码的正则表达式

时间:2016-07-20 14:21:16

标签: regex

我正在尝试使用Regex来检查某个号码是否是有效的法语电话号码。

必须是这样的:

+33 X XX XX XX XX

或:

/^(\+33\s[1-9]{8})|(0[1-9]\s{8})$/

这是我实施的,但它错了......

typeAndWait

9 个答案:

答案 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 X0X

  • 数字的其余部分(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更加冗长。

tested on Regex101

注意: 根据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)
}