【问题标题】:Using a regex to remove a specific #tag in Objective-C使用正则表达式删除 Objective-C 中的特定#tag
【发布时间】:2015-02-03 02:45:03
【问题描述】:

我正在尝试解析 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”,一切正常,但这不是我想要做的。我错过了什么?

【问题讨论】:

    标签: ios objective-c regex nsstring


    【解决方案1】:

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

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

    使用消极的向后看。

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

    (?&lt;!\\S) 否定的lookbehind 断言在匹配之前不存在非空格字符。

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

    DEMO

    【讨论】:

    • 这就像一个魅力。感谢您的回答和解释。
    【解决方案2】:

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

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

    【讨论】:

    • 这是我之前的实现。但是当字符串类似于 "I am just #testing" 时它失败了。我只剩下“我只是 ing”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2019-02-16
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多