正则表达式从字符串匹配手机号码

时间:2017-09-07 15:53:38

标签: regex go

我想从字符串中匹配正确的电话号码。例如:

string := "my phone number is 15817452367"
re := regexp.MustCompile(`1[34578][0-9]{9}`)
re.FindAllString(string, -1)
-> 15817452367

此结果是正确的,但对于另一个字符串:

string := "my card number is 115817452367"
re := regexp.MustCompile(`1[34578][0-9]{9}`)
re.FindAllString(string, -1)
-> 15817452367 (invalid)

此正则表达式也与电话号码匹配,但我希望这不是有效值,我不想从电话号码中获取数字字符串。我该如何修复正则表达式?提前谢谢!

2 个答案:

答案 0 :(得分:1)

您可以检查正则表达式的结束和结束,以查找字符串的结尾/结尾或非数字字符,并仅捕获电话号码。

以下是一些正常工作的正则表达式:

(?:^|[^0-9])(1[34578][0-9]{9})(?:$|[^0-9])

在Golang

re := regexp.MustCompile(`(?:^|[^0-9])(1[34578][0-9]{9})(?:$|[^0-9])`)
submatch := re.FindStringSubmatch("Phone Number: 15817452367;")
if len(submatch) < 2 {
    // No match found
}
match := submatch[1]

<强>解释

查找字符串的开头或非数字字符。 附在非捕获组中。

(?:^|[^0-9])

找到您要搜索的电话号码。 附在捕获组中。

(1[34578][0-9]{9})

查找字符串的结尾或非数字字符。 附在非捕获组中。

(?:$|[^0-9])

答案 1 :(得分:0)

您可以检查匹配的字符串是否前面没有数字。 为了检查这一点,将模式嵌套在两个[^0-9]*之间:它表示“没有或不是数字”。

regexp.MustCompile(`[^0-9]*1[34578][0-9]{9}[^0-9]*`)

这样,15817452367将被检测为匹配,但115817452367则不会。