将字符串拆分为标记的最佳方法是跳过转义分隔符?

时间:2010-02-13 17:08:44

标签: objective-c split delimiter escaping

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

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

现在我考虑一下,我需要检查分隔符之前的转义字符数是否均匀,因为只有才是分隔符本身没有被转义。

如果有人有这样做的方法,我会很感激,如果我可以看看它。

3 个答案:

答案 0 :(得分:1)

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

  1. 如果您找到反斜杠,请忽略但无条件地复制下一个字符(如果存在)
  2. 如果您找到逗号,则该部分的结尾
  3. 您可以手动执行此操作或使用NSScanner的某些功能来帮助您(scanUpToCharactersFromSet:intoString:)

答案 1 :(得分:0)

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

答案 2 :(得分: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];
}