为什么这个正则表达式测试总是返回NO?

时间:2011-04-25 11:59:50

标签: objective-c regex

我使用以下正则表达式:

NSString *reg1 = @"/[$|§|%|&|{|}|'|`|´|^|°|~]/i";

NSPredicate *messageTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",
                           reg1];

我测试字符串是否匹配此正则表达式:

if([messageTest evaluateWithObject:message] == NO){
        messageValid = NO;
        NSLog(@"message invalid");
}

因此,如果文本包含正则表达式中指定的任何字符,则文本无效。

这个正则表达式在javascript中为我工作。但是在objective-c中,无论字符串中包含哪些字符,我都会得到NO。

问题出在哪里?

2 个答案:

答案 0 :(得分:4)

您的代码基本上存在两个问题。首先,你的正则表达式

NSString *reg1 = @"/[$|§|%|&|{|}|'|`|´|^|°|~]/i";

错了:

  • ICU正则表达式不使用/ pattern / modifier。另外,为什么要为该字符集指定不区分大小写的匹配?
  • ICU正则表达式需要引用以下字符:$ { } ^
  • 作为回首者提及,请勿使用|分隔字符类中的字符。

您想要的ICU正则表达式是

[\$§%&\{\}'`´\^°~]

在你的程序中试试这个:

NSString *reg1 = @"[\\$§%&\\{\\}'`´\\^°~]";

(请注意,\字符在Objective-C字符串中表示为\\。)

其次,你正在测试

if([messageTest evaluateWithObject:message] == NO)

检查邮件是否无效。但-evaluateWithObject:返回NO表示不是匹配,因此字符串不包含任何字符,因此字符串 有效。你需要改变它的相反,即:

if([messageTest evaluateWithObject:message])

表示 匹配,因此该字符串至少包含其中一个字符,因此字符串不是有效。

答案 1 :(得分:1)

  • 在字符类中,不要将字符与|字符分开。字符类只能匹配一个字符,而char类只是一个字符可能的列表。 (见:Character classes
  • 我不知道目标C,但我的猜测是你不想要/分隔符。我想这可能是你的主要问题。
  • 你的问题不明确。你想检查字符串中的任何一个字符是否匹配,或者你想确定字符串中的所有字符是否匹配,或者你想看看是否所有字符都匹配或者是什么?

那说试试这可以纠正一些问题:

NSString *reg1 = @"[$§%&{}'`´^°~]";