static inline NSRegularExpression * ParenthesisRegularExpression() { static NSRegularExpression *_parenthesisRegularExpression = nil; static dispatch_once_t oncetoken; dispatch_once(&oncetoken,^{ _parenthesisRegularExpression = [[NSRegularExpression alloc] initWithPattern:@"\[[^\(\)]+\]" options:NSRegularExpressionCaseInsensitive error:nil]; }); return _parenthesisRegularExpression;}
我用它来向我展示比赛:
NSRange matchRange = [result rangeAtIndex:0];Nsstring *matchString = [[self.markerPointInfoDictionary objectForKey:@"long_description"] substringWithRange:matchRange];NSLog(@"%@",matchString);
但它正在返回文本组中第一个[到最后一个]的所有文本.两者之间有很多括号.
我使用此代码将文本更改为斜体:
-(TTTAttributedLabel*)setItalicTextForLabel:(TTTAttributedLabel*)attributedLabel FontSize:(float)Size{ [attributedLabel setText:[self.markerPointInfoDictionary objectForKey:@"long_description"] afterinheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) { NSRange stringRange = NSMakeRange(0,[mutableAttributedString length]); NSRegularExpression *regexp = ParenthesisRegularExpression(); UIFont *italicSystemFont = [UIFont italicSystemFontOfSize:Size]; CTFontRef italicFont = CTFontCreateWithname((__brIDge CFStringRef)italicSystemFont.Fontname,italicSystemFont.pointSize,NulL); [regexp enumerateMatchesInString:[mutableAttributedString string] options:0 range:stringRange usingBlock:^(NSTextCheckingResult *result,NSMatchingFlags flags,BOol *stop) { NSRange matchRange = [result rangeAtIndex:0]; Nsstring *matchString = [[self.markerPointInfoDictionary objectForKey:@"long_description"] substringWithRange:matchRange]; NSLog(@"%@",matchString); if (italicFont) { [mutableAttributedString removeAttribute:(Nsstring *)kCTFontAttributename range:result.range]; [mutableAttributedString addAttribute:(Nsstring *)kCTFontAttributename value:(__brIDge ID)italicFont range:result.range]; CFRelease(italicFont); NSRange range1 = NSMakeRange (result.range.location,1); NSRange range2 = NSMakeRange (result.range.location + result.range.length -2,1); [mutableAttributedString replaceCharactersInRange:range1 withString:@""]; [mutableAttributedString replaceCharactersInRange:range2 withString:@""]; } }]; return mutableAttributedString; }]; return attributedLabel;}
顺便说一下,我的文字看起来像这样:
[hello] welcome [world],my [name] is [lakesh]
结果如下:
match string is [hello]match string is [world]match string is is [lakthen crash..
需要一些指导来告诉我我的错误.
解决方法 我没有想过你正在展示的代码,但你的正则表达似乎太贪心了:@"\[[^\(\)]+\]"
这匹配括号“[]”之间的1-n个字符.字符由一个字符类定义,该字符类表示“除了paranthesis之外的所有字符”,即“()”除外.
换句话说,您的角色类也匹配括号字符.结果是你的表达式匹配第一个“[”和最后一个“]”之间的所有内容.
我建议您尝试使用以下正则表达式:
@"\[[^\[\]]+\]"
如果您没有嵌套括号,您甚至可以将其简化为:
@"\[[^\]]+\]"
编辑
这是您提供的代码和示例输入文本的简化版本,但使用我建议的正则表达式.在我的环境中,这非常有效,它会在我的调试输出窗口中打印4行.我不知道是什么原因造成你的崩溃,所以我建议你一步一步地开始简化自己的代码,直到找到问题为止.
Nsstring* mutableAttributedString = @"[hello] welcome [world],my [name] is [lakesh]";NSRange stringRange = NSMakeRange(0,[mutableAttributedString length]);NSRegularExpression* regexp = [[NSRegularExpression alloc] initWithPattern:@"\[[^\]]+\]" options:NSRegularExpressionCaseInsensitive error:nil];[regexp enumerateMatchesInString:mutableAttributedString options:0 range:stringRange usingBlock:^(NSTextCheckingResult *result,BOol *stop) { NSRange matchRange = [result rangeAtIndex:0]; Nsstring* matchString = [mutableAttributedString substringWithRange:matchRange]; NSLog(@"%@",matchString); } ];
与您的代码的主要区别是:
>我不使用TTTAttributedLabel
>我不使用NSMutableAttributedString
>我不使用self.markerPointInfoDictionary
>我没有if(italicFont)代码块
所以你的问题应该在其中一个方面.
总结以上是内存溢出为你收集整理的在iOS中搜索带有括号的单词全部内容,希望文章能够帮你解决在iOS中搜索带有括号的单词所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)