【问题标题】:Checking for a valid Hebrew regex return always YES检查有效的希伯来语正则表达式返回总是 YES
【发布时间】:2014-11-02 16:07:59
【问题描述】:

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

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

【问题讨论】:

    标签: ios objective-c regex


    【解决方案1】:

    这里可能有两件事出错,具体取决于您的测试字符串。首先,您的正则表达式中的星号允许与否则不匹配的字符串进行空匹配,这就是您的正则表达式可能匹配英文字符串的原因 - 在@"Hello, world!" 上匹配您的正则表达式会返回{0, 0},该范围的位置不是@987654323 @,但其长度为零。

    另一个问题是您没有锚定搜索。这将允许正则表达式匹配字符串中原本不匹配的单数字符(例如@"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:];他们可以帮助您找到可能导致您的正则表达式不必要地接受的匹配项。

    【讨论】:

    • 好的,我测试了它,它阻止了希伯来语字符。此外,它告诉我'从枚举类型隐式转换......'
    • @IdanMoshe 抱歉,我从编辑器复制代码时将NSMatchingAnchored 放在了错误的位置。现在应该修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多