我有一个特定的正则表达式模式要检查。 有效的结果只是希伯来语,字母,标记等。
//////////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
,即使只有英文字符串。
答案 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:]
;他们可以帮助您找到可能导致您的正则表达式不必要地接受的匹配。