【发布时间】:2016-03-11 06:49:33
【问题描述】:
我正在开发一个适用于电话号码的应用程序,但我在使用正则表达式查找字符串中的电话号码时遇到了问题。
我的应用会查看联系人的电话号码,可以是:
(带破折号“-”)
XXXX-XXXX
XXXXX-XXXXX
(YY) XXXX-XXXX
(YY) XXXX-XXXX
+ZZ (YY) XXXX-XXXX
+ZZ (YY) XXXXX-XXXX
(不带破折号)
XXXXXXX
XXXXXXXXX
(YY) XXXXXXX
(YY) XXXXXXXXX
+ZZ (YY) XXXXXXX
+ZZ (YY) XXXXXXXXX
基于以上所有这些可能性,我编写了以下代码:
let range = telefone.rangeOfString("[0-9]{4,5}-[0-9]{4}", options:.RegularExpressionSearch)
let range2 = telefone.rangeOfString("[0-9]{9}$", options:.RegularExpressionSearch)
var found: String?
if range != nil{
found = telefone.substringWithRange(range!)
}else if range2 != nil{
found = telefone.substringWithRange(range2!)
}
print(found)
range 是查找电话号码的正则表达式(带破折号“-”)range2 是为电话号码提供资金的正则表达式(不带破折号)
有了这个代码,我只得到电话号码,没有国家代码或区号。
问题是,当我使用
+ZZ (YY) XXXXX-XXXX 之类的电话号码进行测试时,此代码在找到的变量上返回 nil
有人可以帮我找到另一种方法来编写一个正则表达式来仅获取包含所有联系电话号码的字符串的“X”值吗?
更新:
我注意到上面的代码,变量范围,返回null
var telefone = "+42 43 23123-2221"
let range = telefone.rangeOfString("\\d{4,5}\\-?\\d{4}", options:.RegularExpressionSearch)
print("range \(range)") //here returns nil
【问题讨论】:
-
是否总是 2、2、(4 或 5)、4 模式?您可以使用简单的
(?:\d{2}\D*){0,2}\d{4,5}\D*\d{4}或更多保证(?<!\d)(?:\d{2}\D*){0,2}\d{4,5}\D*\d{4}(?!\d) -
这个将捕获部分 grps 1-4。
(?<!\d)(?:(\d{2})\D*)?(?:(\d{2})\D*)?(\d{4,5})\D*(\d{4})(?!\d)demo -
根据您的回答,我使用了\d{4,5}\-?\d{4},这是我需要的数字部分。但它没有找到使用 .rangeOfString("\\d{4,5}\\-?\\d{4}", options:.RegularExpressionSearch)。我已经用完整的代码更新了我的问题。谢谢!!
-
this code 适合你吗?
-
我刚刚意识到正则表达式不支持这种格式。这是working one:
pattern = "(?:(?:\\+\\d{2}\\h*)?(?:\\(\\d{2}\\)|\\d{2}))?\\h*(\\d{4,5}-?\\d{4})"。请注意,OP 中未提及此电话号码格式。