【问题标题】:Best way to split a string into tokens skipping escaped delimiters?将字符串拆分为跳过转义分隔符的标记的最佳方法?
【发布时间】:2010-02-13 17:08:43
【问题描述】:

我收到一个NSString,它使用逗号作为分隔符,反斜杠作为转义字符。我正在考虑使用componentsSeparatedByString 拆分字符串,但我发现无法指定转义字符。有没有内置的方法可以做到这一点? NSScanner? CFStringTokenizer?

如果不是,最好在逗号处分割字符串,然后重新加入被错误分割的标记(在检查它们最后是否有(非转义)转义字符之后)或循环遍历每个字符以尝试找到一个逗号,然后回看一个字符,看看逗号是否被转义(然后再看一个字符,看看转义字符是否被转义)。

现在我想起来了,我需要检查分隔符之前的转义字符数量是否是偶数,因为 只有这样 分隔符本身才不会被转义。

如果有人有这样的方法,如果我能看一下,我将不胜感激。

【问题讨论】:

    标签: objective-c split delimiter escaping


    【解决方案1】:

    我认为最直接的方法是按照您的建议逐个字符地遍历字符串,并将其附加到新的字符串对象中。你可以遵循两个简单的规则:

    1. 如果发现反斜杠,忽略但无条件复制下一个字符(如果存在)
    2. 如果找到逗号,则结束该部分

    您可以手动执行此操作或使用 NSScanner 的某些功能来帮助您 (scanUpToCharactersFromSet:intoString:)

    【讨论】:

    • 谢谢,我几乎完成了我在原始帖子中描述的编码,但我认为您的解决方案更快更容易实现。我很困惑没有框架功能可以做到这一点,我本以为它会更常见。
    【解决方案2】:

    我更喜欢使用基于正则表达式的解析器来清除转义字符,然后可能对字符串进行(某种类型的)拆分操作。

    【讨论】:

      【解决方案3】:

      好的,(我希望)这是 wipolar 建议的。这是第一个有效的实现。我刚开始使用非 GC 收集的语言,所以如果您认为此代码可以改进,请发表评论,尤其是在内存管理部门。

      - (NSArray *) splitUnescapedCharsFrom: (NSString *) str atChar: (char) delim withEscape: (char) esc
      {
          NSMutableArray * result = [[NSMutableArray alloc] init];
          NSMutableString * currWord = [[NSMutableString alloc] init];
      
          for (int i = 0; i < [str length]; i++)
          {
              if ([str characterAtIndex:i] == esc)
              {
                  [currWord appendFormat:@"%c", [str characterAtIndex:++i]];
              }
              else if ([str characterAtIndex:i] == delim)
              {
                  [result addObject:[NSString stringWithString:currWord]];
                  [currWord release];
                  currWord = [[NSMutableString alloc] init];
              }
              else
              {
                  [currWord appendFormat:@"%c", [str characterAtIndex:i]];
              }
          }
      
          [result addObject:[NSString stringWithString:currWord]];
          [currWord release];
      
          return [NSArray arrayWithArray:result];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-03
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多