【问题标题】:Regex stringByReplacingMatchesInString (replacing spaces in quoted string)正则表达式 stringByReplacingMatchesInString (替换引号字符串中的空格)
【发布时间】:2018-06-08 15:39:56
【问题描述】:

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

例如:

托托“是比尔”应该变成 托托“是#Bill”

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

我已经根据另一个代码使用以下代码进行了试验 post

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*) 也不行

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

【问题讨论】:

  • 你不能用普通的正则表达式和字符串替换模式来做到这一点,因为起始和尾随分隔符是相等的。您需要一个回调来替换双引号子字符串中的所有空格,唯一缺少的是您的字符串是否可以包含转义序列,或者它们是否可以仅与 "[^"]+" 模式匹配。
  • 我的字符串是搜索文本框的字符串。它们不会包含转义序列。
  • 对于这么简单的事情,这看起来有点矫枉过正,但好的,我会试试这个。thx
  • 对不起,那是 Objective-C。在 Python 中,它只是一个 re.sub(r'"[^"]+"', lambda x: x.group().replace(' ', '#'), s)。在 C# 中,Regex.Replace(s, "\"[^\"]+\"", m =&gt; m.Value.Replace(" ", "#"))。 JS:s.replace(/"[^"]+"/g, function(m) {return m.replace(/\s/g, '#');})

标签: regex replace nsstring space quotes


【解决方案1】:

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

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

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

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

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

2) 我使用以下正则表达式替换空格 (?:(?"\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);
    }

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

代币账单

表示天气晴朗

代币酷

希望对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多