我有一个特定的正则表达式模式需要检查。有效的结果是只有希伯来语,字母,标记等
//////////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不必要地接受的匹配项。