正则表达式在iOS上无法正常工作

时间:2013-11-29 12:07:53

标签: ios regex

有人可以解释以下正则表达式的含义:

  

^ [+]?[0-9] {0,4} []?(\([0-9] {1,6} \))?[0-9()/ - ] {4, } $

这不允许我验证(0049)(0)151-544 / 187 29或(0049)(0)15154418729

我试图调试,我的理解是这个数字存在问题,它有2个开括号和闭括号()。

如果我将(0049)(0)151-544 / 187 29作为(0049)151-544 / 187 29 ,则可行。

有人可以帮忙。

3 个答案:

答案 0 :(得分:6)

您的正则表达式^[+]?[0-9]{0,4}[ ]?(\([0-9]{1,6}\))?[0-9 ()/-]{4,}$表示为

enter image description here

如果您需要group1多次将*添加到该组

<code>enter image description here</code>

答案 1 :(得分:1)

上面的正则表达式只接受一对括号中的数字,即(),如果你需要多个()来accpet在结束括号之前添加星号(*)符号

使用下面的正则表达式。

^[+]?[0-9]{0,4}[ ]?(\([0-9]{1,6}\)*)?[0-9 ()/-]{4,}$

如果不起作用,则根据需要替换星号

答案 2 :(得分:1)

有人可以解释以下正则表达式的含义

请参阅我提交给您审核的字符串的分解。顺便说一句 - 这是参考文档工作的一个例子,因为在此问题之前我没有尝试过使用NSRegularExpression。感谢您有机会学到新的东西。

^[+]?[0-9]{0,4}[ ]?(\([0-9]{1,6}\))?[0-9 ()/-]{4,}$

注意 - 我的解释直接来自下面参考链接的表1和表2.

^ - 在一行开头匹配

[+] - [pattern]匹配模式中的任何一个字符。

? - 匹配零次或一次。喜欢一个。

[0-9] - [pattern]匹配模式中的任何一个字符。

{0,4} - 匹配0到4次。匹配尽可能多的次数,但不超过4次。

[ ] - 匹配模式中的任何一个字符(在本例中为单个空格)

? - 匹配零次或一次。喜欢一个。

(\([0-9]{1,6}\)) - (...)捕获括号。匹配带括号的子表达式的输入范围在匹配后可用

在该子表达式中,我们看到:

\ - 将以下字符视为文字,抑制任何特殊含义。仅在替换文本中使用反斜杠转义才能获得&#39; $&#39;和&#39; \&#39;,但可以在没有不良影响的任何其他角色上使用。

后跟(,这意味着将左括号视为文字

[0-9] - [pattern]匹配模式中的任何一个字符。

{1,6} - 匹配1到6次。匹配尽可能多的次数,但不超过6次。

仍然在我们看到的子表达式中:

\ - 将以下字符视为文字,抑制任何特殊含义。仅在替换文本中使用反斜杠转义才能获得&#39; $&#39;和&#39; \&#39;,但可以在没有不良影响的任何其他角色上使用。

后跟),这意味着将右括号视为文字

? - 匹配零次或一次。喜欢一个。 (这似乎是问题,你只匹配零或一次

[0-9 ()/-] - [pattern]匹配模式中的任何一个字符。

{4,} - 至少匹配4次。占有匹配。

$ - 在一行结束时匹配。请参阅表4中的NSRegularExpressionAnchorsMatchLines和m字符表达式。

有关元字符和运算符的进一步说明,请参阅apple documentation on NSRegularExpression Class Reference

有关\:

的其他说明

\ - 引用以下字符。必须引用被视为文字的字符是*? + [(){} ^ $ | \。 /

有趣的注意事项:

我发现escapedPatternForString方法可以生成一个模式样本,允许用户从一个所需的输出中对转义的模式字符串进行反向工程。它没有完美地输出模式,但确实有助于元字符..

NSString *sample = @"(0049) (0)151-544/187 29";
NSString *pattern = [NSRegularExpression escapedPatternForString:sample];

//Pattern sample: \(0049\) \(0\)151-544\/187 29
NSLog(@"Pattern sample: %@", pattern);