1

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

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

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

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

4

3 回答 3

1

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

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

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

于 2010-02-13T17:52:32.913 回答
0

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

于 2010-02-13T17:56:11.877 回答
0

好的,(我希望)这就是 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];
}
于 2010-02-14T15:33:46.203 回答