检查有效的希伯来语正则表达式总是返回YES



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

//////////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,即使只是英文字符串。

根据测试字符串的不同,这里可能会出现两个问题。首先,正则表达式中的星号允许与原本不匹配的字符串进行空匹配,这就是为什么正则表达式可能与英文字符串匹配——在@"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:];它们可以帮助您找到可能导致regex不必要地接受的匹配项。

最新更新