检查有效的希伯来语正则表达式返回始终为YES

时间:2014-11-02 16:07:59

标签: ios objective-c regex

我有一个特定的正则表达式模式要检查。 有效的结果只是希伯来语,字母,标记等。

//////////Regex//////////
static NSString *const HEBREW_NUMBERS_NON_NUMERIC_CHAR = @"([\u0590-\u05FF]*|[0-9]*|[\\s]*|[.-:;,?!/&*()+=_'\"]*)+";


+ (BOOL)hasValidOpenLine:(NSString *)openLine
{
    if (openLine.length >= MIN_NUMBER_OF_CHARACTERS_IN_OPEN_LINE || openLine.length <= MAX_NUMBER_OF_CHARACTERS_IN_OPEN_LINE) {
        NSError *errorRegex;
        NSRegularExpression *regexOpenLine = [[NSRegularExpression alloc] initWithPattern:HEBREW_NUMBERS_NON_NUMERIC_CHAR
                                                                                  options:0
                                                                                    error:&errorRegex];
        NSRange range = NSMakeRange(0, openLine.length);

        if ([regexOpenLine numberOfMatchesInString:openLine options:0 range:range] > 0) {
            return YES;
        }
    }
    return NO;
}

但无论我输入什么内容,它总是返回YES,即使只有英文字符串。

1 个答案:

答案 0 :(得分:2)

这里可能会出现两个问题,具体取决于您的测试字符串。首先,你的正则表达式中的星星允许空格匹配字符串,否则不匹配,这就是为什么你的正则表达式可能匹配英文字符串 - 匹配你的正则表达式@"Hello, world!"返回{0, 0},一个范围的位置不是NSNotFound,但长度为零。

另一个问题是您没有锚定您的搜索。这将允许正则表达式匹配否则不匹配的字符串中的单个字符(例如,中的@"Hello, world!")。你需要做的是锚定正则表达式,以便整个字符串必须匹配,否则正则表达式拒绝它。

您修改后的代码可能如下所示:

static NSString *const HEBREW_NUMBERS_NON_NUMERIC_CHAR = @"([\u0590-\u05FF]|[0-9]|[\\s]|[.-:;,?!/&*()+=_'\"])+";

+ (BOOL)hasValidOpenLine:(NSString *)openLine
{
    if (openLine.length >= MIN_NUMBER_OF_CHARACTERS_IN_OPEN_LINE || openLine.length <= MAX_NUMBER_OF_CHARACTERS_IN_OPEN_LINE) {
        NSError *errorRegex;
        NSRegularExpression *regexOpenLine = [[NSRegularExpression alloc] initWithPattern:HEBREW_NUMBERS_NON_NUMERIC_CHAR
                                                                                  options:0
                                                                                    error:&errorRegex];
        if ([regexOpenLine numberOfMatchesInString:openLine options:NSMatchingAnchored range:NSMakeRange(0, openLine.length)] > 0) {
            return YES;
        }
    }

    return NO;
}

现在,这将与@"שלום!"之类的字符串匹配,而不是@"Hello, world!"@"Hello: היי"之类的字符串,这是我认为您正在寻找的内容。


将来,如果您正在寻找调试正则表达式,请使用-[NSRegularExpression rangeOfFirstMatchInString:options:range:]-[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:];他们可以帮助您找到可能导致您的正则表达式不必要地接受的匹配。