Objective-C中的正则表达式:如何用动态模板替换匹配项?

奥雷利安·里邦

我的输入就像"Hi {{username}}",即。带有要替换的关键字的字符串。但是,输入的值很小(〜10个关键字,总共1000个字符),我在哈希表数据结构中存储了100万个可能的关键字,每个关键字都与其替换相关联。

因此,出于明显的性能原因,我不想遍历关键字列表并尝试替换输入中的每个关键字。我更喜欢通过查找正则表达式模式对输入字符进行一次迭代"\{\{.+?\}\}"

在Java中,我使用Matcher.appendReplacementMatcher.appendTail方法来实现。但是我找不到与相似的API NSRegularExpression

private String replaceKeywords(String input)
{        
    Matcher m = Pattern.compile("\\{\\{(.+?)\\}\\}").matcher(input);
    StringBuffer sb = new StringBuffer();

    while (m.find())
    {
        String replacement = getReplacement(m.group(1));
        m.appendReplacement(sb, replacement);
    }

    m.appendTail(sb);
    return sb.toString();
}

我是否被迫自己实现此类API,还是错过了某些东西?

马丁·R

您可以使用以下方法实现此目的NSRegularExpression

NSString *original = @"Hi {{username}} ... {{foo}}";
NSDictionary *replacementDict = @{@"username": @"Peter", @"foo": @"bar"};

NSString *pattern = @"\\{\\{(.+?)\\}\\}";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                       options:0
                                     error:NULL];

NSMutableString *replaced = [original mutableCopy];
__block NSInteger offset = 0;
[regex enumerateMatchesInString:original
            options:0
              range:NSMakeRange(0, original.length)
             usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSRange range1 = [result rangeAtIndex:1]; // range of the matched subgroup
    NSString *key = [original substringWithRange:range1];
    NSString *value = replacementDict[key];
    if (value != nil) {
        NSRange range = [result range]; // range of the matched pattern
        // Update location according to previous modifications:
        range.location += offset;
        [replaced replaceCharactersInRange:range withString:value];
        offset += value.length - range.length; // Update offset
    }
}];
NSLog(@"%@", replaced);
// Output: Hi Peter ... bar

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用Objective-C中的图像替换属性字符串中的正则表达式匹配

来自分类Dev

Objective-C正则表达式匹配

来自分类Dev

正则表达式匹配组不适用于Objective-C

来自分类Dev

跨多行的Objective-C / Swift正则表达式匹配

来自分类Dev

Objective-C正则表达式为“(空)”

来自分类Dev

Objective C正则表达式行以数字开头

来自分类Dev

正则表达式,用于Objective C中的html字符串

来自分类Dev

带正则表达式的分割字符串-Objective-C

来自分类Dev

Objective C正则表达式删除除数字以外的所有内容

来自分类Dev

Objective-C正则表达式检查两个数字的序列

来自分类Dev

这个Objective-C正则表达式有什么问题?

来自分类Dev

Objective C正则表达式从包含文本的行中提取数据

来自分类Dev

用于触摸Hastags的Objective-C正则表达式

来自分类Dev

无法在Objective-C中使用正则表达式

来自分类Dev

如何用Objective-C替换&ndash

来自分类Dev

如何用Objective-C替换&ndash

来自分类Dev

如何在正则表达式匹配项中替换字符串

来自分类Dev

如何捕获全局正则表达式替换中的每个匹配项?

来自分类Dev

如何使用搜索/替换在Vim中访问正则表达式匹配项?

来自分类Dev

如何用发现的不区分大小写的正则表达式替换匹配项,但扩展结果

来自分类Dev

正则表达式将匹配项中的所有匹配项替换x次

来自分类Dev

正则表达式子方法不会替换python正则表达式中的所有匹配项

来自分类Dev

正则表达式(或不)用动态变量替换所有匹配项

来自分类Dev

通过R中的正则表达式匹配找到字母后如何用小写字母替换

来自分类Dev

TextWrangler中的正则表达式/ grep替换,用指定的文本替换后续的匹配项

来自分类Dev

如何用空值替换动态正则表达式?

来自分类Dev

如何用正则表达式替换匹配的组值

来自分类Dev

正则表达式如何用匹配的大小写替换?

来自分类Dev

如何用匹配的正则表达式模式替换特定位置的字符串

Related 相关文章

  1. 1

    用Objective-C中的图像替换属性字符串中的正则表达式匹配

  2. 2

    Objective-C正则表达式匹配

  3. 3

    正则表达式匹配组不适用于Objective-C

  4. 4

    跨多行的Objective-C / Swift正则表达式匹配

  5. 5

    Objective-C正则表达式为“(空)”

  6. 6

    Objective C正则表达式行以数字开头

  7. 7

    正则表达式,用于Objective C中的html字符串

  8. 8

    带正则表达式的分割字符串-Objective-C

  9. 9

    Objective C正则表达式删除除数字以外的所有内容

  10. 10

    Objective-C正则表达式检查两个数字的序列

  11. 11

    这个Objective-C正则表达式有什么问题?

  12. 12

    Objective C正则表达式从包含文本的行中提取数据

  13. 13

    用于触摸Hastags的Objective-C正则表达式

  14. 14

    无法在Objective-C中使用正则表达式

  15. 15

    如何用Objective-C替换&ndash

  16. 16

    如何用Objective-C替换&ndash

  17. 17

    如何在正则表达式匹配项中替换字符串

  18. 18

    如何捕获全局正则表达式替换中的每个匹配项?

  19. 19

    如何使用搜索/替换在Vim中访问正则表达式匹配项?

  20. 20

    如何用发现的不区分大小写的正则表达式替换匹配项,但扩展结果

  21. 21

    正则表达式将匹配项中的所有匹配项替换x次

  22. 22

    正则表达式子方法不会替换python正则表达式中的所有匹配项

  23. 23

    正则表达式(或不)用动态变量替换所有匹配项

  24. 24

    通过R中的正则表达式匹配找到字母后如何用小写字母替换

  25. 25

    TextWrangler中的正则表达式/ grep替换,用指定的文本替换后续的匹配项

  26. 26

    如何用空值替换动态正则表达式?

  27. 27

    如何用正则表达式替换匹配的组值

  28. 28

    正则表达式如何用匹配的大小写替换?

  29. 29

    如何用匹配的正则表达式模式替换特定位置的字符串

热门标签

归档