我有一个Emoji
实体列表,每个都有属性codes
,我想检查字符串("]:-)"
),如果它包含任何一个,然后用图像替换微笑。
for (Emoji *emoji in self.emojis) {
for (NSString *code in emoji.codes) {
NSString *pattern = [NSRegularExpression escapedPatternForString:code];
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
NSArray *matches = [regex matchesInString:[sourceString string] options:0 range:NSMakeRange(0, [sourceString length])];
[matches enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSTextCheckingResult * _Nonnull aResult, NSUInteger idx, BOOL * _Nonnull stop) {
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
[attachment setImage:[UIImage imageNamed:emoji.image]];
NSAttributedString *replacement = [NSAttributedString attributedStringWithAttachment:attachment];
[sourceString replaceCharactersInRange:[aResult range] withAttributedString:replacement];
}];
}
}
问题是代码]:-)
的微笑包含:-)
和我的方法替换为下一个:为]
括号[image]
+ :-)
,这是因为:-)
在列表中排名第一。
如何检查确切的字符串?
我试过了:]:-/)
,\\b]:-/)\\b
,/^]:-/)$/
也许有更好的解决方案让这个工作。
如果我理解你当前的结构:
@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSArray *codes;
@end
一种可能的解决方案是使用一对值:imageName / code
@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSString *code;
@end
self.emojis
将有大量的Emoji
对象,可能具有相同的图像名称用于不同的代码,但这样做的一个好处是这个小技巧:
按照“较小”表情符号结尾的方式对self.emojis
进行排序。所以你首先只替换“冗长的”和较小的。
self.emojis = [arrayOfSingleEmojis sortedArrayUsingComparator:^NSComparisonResult(Emoji * _Nonnull emoji1, Emoji * _Nonnull emoji2) {
NSUInteger length1 = [[emoji1 code] length];
NSUInteger length2 = [[emoji2 code] length];
return [@(length2) compare:@(length1)]; //Or reverse length1 & length2, I never know, I always have to test, but I think it's the correct one
}];
所以在你目前的情况下:]:-)
将在:-)
之前被替换所以你应该有<imageFor:">:-)"]
而不是]<imageFor:":-)>