Regexp在iPhone上崩溃

Regexp在iPhone上崩溃,iphone,objective-c,regex,Iphone,Objective C,Regex,我有一个正则表达式,如下所示: ^(\+\d\d)?(?(?<=\+\d\d)((| )\(0\)(| )| |)|(0))(8|\d\d\d?)[-/ ]?\d\d( ?\d){1,4} ?\d\d$ ^(+\+\d\d)这是一个条件: (?(condition)true-expression|false-expression) (?(条件)真表达式|假表达式) 由于NSPredicate使用ICU的正则表达式包,因此此类条件不可用。请参阅: 您应该使用第三方正则表达式库。我将您的正

我有一个正则表达式,如下所示:

^(\+\d\d)?(?(?<=\+\d\d)((| )\(0\)(| )| |)|(0))(8|\d\d\d?)[-/ ]?\d\d( ?\d){1,4} ?\d\d$
^(+\+\d\d)这是一个条件:

(?(condition)true-expression|false-expression) (?(条件)真表达式|假表达式) 由于NSPredicate使用ICU的正则表达式包,因此此类条件不可用。请参阅:

您应该使用第三方正则表达式库。

我将您的正则表达式转换为详细形式并进行注释,使其“易读”,这样您就可以看到它试图做什么。我希望您会同意,这大部分都没有多大意义:

^                   # Start of string
(\+\d\d)?           # Match + and two digits optionally, capture in backref 1
(?(?<=\+\d\d)       # Conditional: If it was possible to match +nn previously,
 (\s?\(0\)\s?|\s|)  # then try to match (0), optionally surrounded by spaces
                    # or just a space, or nothing; capture that in backref 2
 |                  # If it was not possible to match +nn,
 (0)                # then match 0 (capture in backref 3)
)                   # End of conditional
(8|\d\d\d?)         # Match 8 or any two-three digit combination --> backref 4
[-/\s]?             # match a -, / or space optionally
\d\d                # Match 2 digits, don't capture them
(\s?\d){1,4}        # Match 1 digit, optionally preceded by spaces; 
                    # do this 1 to 4 times, and capture only the last match --> backref 5
\s?\d\d             # Match an optional space and two digits, don't capture them
$                   # End of string
它在字符串上失败,比如

+46 (0) 1234567
+49 (0) 1234567
+00 1234567
+99 08 11 1 11
01234567
012-34 5 6 7 8 90
+7 123 1234567
+346 (77) 123 4567
+46 (0) 12/34 56 7
所以我非常怀疑它是否在做它应该做的事情。除此之外,大部分正则表达式可以简化很多,在过程中去掉绊倒你正则表达式库的条件。优化一些被破坏的东西没有多大意义,但是如果你的客户坚持,这里有一个版本具有完全相同的功能,但是不带条件:

^(?:\+\d\d(?: ?(?:\(0\)\s?)?)?|0)(?:8|\d\d\d?)[-/ ]?\d\d(?: ?\d){1,4} ?\d\d$

谢谢!我还没有自己创建Regexp,所以我不确定规则和允许的电话号码格式。它是从另一个(web)中获取的我的客户正在使用的应用程序,他们现在希望在iPhone应用程序中实现相同的验证。这正是我所期望的。将编辑我的答案。尽管你应该明确地告诉你的客户,你正在用同样坏的东西替换坏的东西:)
^(?:\+\d\d(?: ?(?:\(0\)\s?)?)?|0)(?:8|\d\d\d?)[-/ ]?\d\d(?: ?\d){1,4} ?\d\d$