美文网首页
谓词NSPredicate匹配正则表达式时奇葩的“空格符”BUG

谓词NSPredicate匹配正则表达式时奇葩的“空格符”BUG

作者: 小代码仔 | 来源:发表于2018-05-09 11:00 被阅读75次

前言:

A. 使用谓词校验某一字符是否符合对应正则表达式时,项目崩溃。多次检验后发现是字符串中的空格符异常。

B. 原本猜测是中文状态和英文状态下“空格符”的区别。再次实验的时候使用中文空格符、英文空格符均不可再现问题。只能复制那个“空格符”进行测试。

C. 虽然解决了这个BUG,也留下了更深的疑问。在简书中直接拷贝是测不到我所说BUG的,有兴趣的同学可以点这里获取资料

BUG展示:

BUG检测出来的过程不在描述。最终测试结果:代码是正确的,字符串中的空格符异常,导致谓词方法报错。项目崩溃。
!!!复制代码是不会再现BUG的。这里获取资料

/*  判断字符串是否满足某一正则表达式
 *
 *  @param str    需要判断的字符串
 *  @param regExp 正则表达式
 *
 *  return
 */
+ (BOOL)string:(NSString *)str regExp:(WJStringRegExp)regExp
{
    NSString *regExpStr = [self getRegExpStr:regExp];   // @"[0-9]*"
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regExpStr];
    return [predicate evaluateWithObject:str];
}
2018-05-09 13:50:37.766700+0800 BUGTest[10571:228345] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',  reason: 'Unable to parse the format string "SELF MATCHES %@"'

奇葩之处:

有问题的字符串和常规手打的字符串作对比。两个看起来一样的字符串,我们通过- (BOOL)isEqualToString:(NSString*)aString;方法来检验它们并不相等。将其通过UTF-8转码后可以明确的看出其不同之处。


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
    NSString *str_0 = @"F S ";  // 未知状态下
    NSString *str_1 = @"F S ";  // 英文状态下

    if([str_0isEqualToString:str_1]) {
        NSLog(@"是一样的啊!!!");
    }
    else
    {
        NSLog(@"是不一样的!!!");
        NSLog(@"str_0 --- %@", [str_0 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]);  
        NSLog(@"str_1 --- %@", [str_1 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]);  
    }

}

2018-05-09 11:03:38.229807+0800 BUGTest[8507:124209] 是不一样的!!!
2018-05-09 11:03:38.230053+0800 BUGTest[8507:124209] str_0 --- F%C2%A0S%C2%A0
2018-05-09 11:03:38.230198+0800 BUGTest[8507:124209] str_1 --- F%20S%20

解决方法:

知道了问题,解决方法就很简单了,将字符串中奇葩的空格符手动替换掉。问题就解决了,项目正常输出,不会崩溃。(最好英文状态下输入)

疑问

UTF-8 转码成%C2%A0的空格符不知道是怎样打出来的。求解。

相关文章

网友评论

      本文标题:谓词NSPredicate匹配正则表达式时奇葩的“空格符”BUG

      本文链接:https://www.haomeiwen.com/subject/wbrnrftx.html