首页 > 解决方案 > 正则表达式 stringByReplacingMatchesInString (替换引号字符串中的空格)

问题描述

上下文是一个 IOS 应用程序。我想替换用括号括起来的空格。

前任:

Toto "is Bill" 应该变成 Toto "is#Bill"

天气“晴朗”应该变成“天气晴朗#and#clear”

我根据另一篇文章使用以下代码进行了 试验

NSString *pattern   = @"(?:(?<=^\")(\\s+))|(?:(?!^\")(\\s+)(?=.))|(?:(\\s+)(?=\"$))";  // (?:(?<=^")(\s+))|(?:(?!^")(\s+)(?=.))|(?:(\s+)(?="$))

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"#"];
NSLog(@"modified %@", modifiedString);

但这不正常。

所有空格都被替换(Toto#"is#Bill")

我只用 (?:(?!^")(\s+)(?=.)) 得到相同的结果

我自己做了一个 (?:\"\S*)(\s)(?:\S*) 也不行

我会很感激这方面的帮助!谢谢

标签: regexreplacensstringspacequotes

解决方案


这是一个解决方案,我正在使用。这可能并不完美,但它可以满足我的需求。

正如 Wiktor Stribiżew 指出的那样,我的问题是我的模式的第一个字符和最后一个字符是同一个字符“他向我提出了一个解决方案,我觉得这有点矫枉过正,但这是必要的,因为 Objective C 中没有回调函数。

作为替代方案,这是我解决问题的方法(替换搜索框的引号字符串中的空格):

1)我在“搜索框”字符串的末尾添加了一个空格

NSString * searchstring1 = [searchString stringByAppendingString:@" "];

2)我使用以下正则表达式替换空格 (?:(?<="^"])(?=\w)|[^\S"])(?=[^"] "\s

        NSString *pattern   = @"(?:(?<=\"^\"])(?=\\w)|[^\\S\"])(?=[^\"]*\"\\s* )";  // (?:(?<="^"])(?=\w)|[^\S"])(?=[^"]*"\s* )
        NSError *error = nil;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
        NSString *searchstring2 = [regex stringByReplacingMatchesInString:searchstring1 options:0 range:NSMakeRange(0, [searchstring1 length]) withTemplate:@"xxx"];
        NSLog(@"modified %@", searchstring2);

3)我隔离所有要搜索的标记(用空格分隔)

NSMutableArray *words = (NSMutableArray *)[searchstring2 componentsSeparatedByString:@" "];

4)恢复带引号的字符串中的空格并删除引号

NSString *token;


    for(token in words)
    {

    token = [token stringByReplacingOccurrencesOfString:@"xxx" withString:@" "];
    token = [token stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    NSLog(@"token %@\n", token);
    }

以下搜索字符串:Bill“天气晴朗”酷 将给出以下输出

代币比尔

象征着天气晴朗

令牌很酷

希望它可以帮助别人。


推荐阅读