使用正则表达式删除 Objective-C 中的特定#tag

Using a regex to remove a specific #tag in Objective-C

我正在尝试解析 Objective-C 中的字符串以删除与特定#tagged 字词完全匹配的内容。我可以创建正则表达式并毫无问题地删除特定单词,但是当我尝试删除带有前导“#”的字符串时,它不起作用。

这是我的代码:

NSString *originalString = @"This is just a #test that isn't working";
NSString *hashTag = @"#test";
NSString *placeholder = @"\b%@\b";
NSString *pattern = [NSString stringWithFormat:placeholder, hashTag];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];

NSString *modifiedString = [regex stringByReplacingMatchesInString:originalString
                                options:0
                                  range:NSMakeRange(0, [originalString length])
                           withTemplate:@""];

问题是即使原始字符串包含字符串#test,它也不会被删除。如果我用 "test" 交换“#test”,一切正常,但这不是我想要做的。我错过了什么?

因为space和#之间不存在单词字符。两者都是非单词字符。所以我建议你删除开头的 \b

NSString *placeholder = @"%@\b";

使用负面回顾。

NSString *placeholder = @"(?<!\S)%@\b";

(?<!\S) 断言在匹配之前不存在非 space 字符的否定回顾。

要进行精确的字符串匹配,我建议您使用此 @"(?<!\S)%@(?!\S)" 正则表达式。 (?!\S) 否定前瞻,断言匹配后不会跟非 space 字符。

DEMO

甚至有必要使用正则表达式,这个功能还不够吗?

[yourstring stringByReplacingOccurrencesOfString:@"#test" withString:@""];