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

Objective c 跳过转义分隔符将字符串拆分为标记的最佳方法?,objective-c,split,delimiter,escaping,Objective C,Split,Delimiter,Escaping,我收到一个NSString,它使用逗号作为分隔符,并使用反斜杠作为转义字符。我正在研究使用componentsSeparatedByString拆分字符串,但是我没有找到指定转义字符的方法。有没有一种内在的方法可以做到这一点?NSScanner?CFStringTokenizer 如果不是,最好是在逗号处拆分字符串,然后重新连接错误拆分的标记(在末尾检查它们是否有(非转义的)转义字符后),或者在每个字符之间循环尝试查找逗号,然后返回一个字符以查看逗号是否转义(然后再添加一个字符以查看转义字符是否

我收到一个
NSString
,它使用逗号作为分隔符,并使用反斜杠作为转义字符。我正在研究使用
componentsSeparatedByString
拆分字符串,但是我没有找到指定转义字符的方法。有没有一种内在的方法可以做到这一点?NSScanner?CFStringTokenizer

如果不是,最好是在逗号处拆分字符串,然后重新连接错误拆分的标记(在末尾检查它们是否有(非转义的)转义字符后),或者在每个字符之间循环尝试查找逗号,然后返回一个字符以查看逗号是否转义(然后再添加一个字符以查看转义字符是否转义)

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


如果有人有这样的方法,如果我能看一看的话,我会很感激的。

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

  • 如果发现反斜杠,请忽略,但无条件复制下一个字符(如果存在)
  • 如果你找到一个逗号,那就在那一节的末尾

  • 您可以手动执行此操作,也可以使用NSScanner的一些功能来帮助您(ScanupCharactersFromSet:intoString:)

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

  • 如果发现反斜杠,请忽略,但无条件复制下一个字符(如果存在)
  • 如果你找到一个逗号,那就在那一节的末尾

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

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

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

    好的,(我希望)这是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];
    }
    
    -(NSArray*)splitUnescapedCharsFrom:(NSString*)str atChar:(char)delim with escape:(char)esc
    {
    NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]init];
    NSMutableString*currWord=[[NSMutableString alloc]init];
    对于(int i=0;i<[str length];i++)
    {
    如果([str characterAtIndex:i]==esc)
    {
    [currWord appendFormat:@“%c”,[str characterAtIndex:++i]];
    }
    else if([str characterAtIndex:i]==delim)
    {
    [结果添加对象:[NSString stringWithString:currWord]];
    [文字发布];
    currWord=[[NSMutableString alloc]init];
    }
    其他的
    {
    [currWord appendFormat:@“%c”,[str characterAtIndex:i]];
    }
    }
    [结果添加对象:[NSString stringWithString:currWord]];
    [文字发布];
    返回[NSArray arrayWithArray:result];
    }
    
    好的,(我希望)这是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];
    }
    
    -(NSArray*)splitUnescapedCharsFrom:(NSString*)str atChar:(char)delim with escape:(char)esc
    {
    NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]init];
    NSMutableString*currWord=[[NSMutableString alloc]init];
    对于(int i=0;i<[str length];i++)
    {
    如果([str characterAtIndex:i]==esc)
    {
    [currWord appendFormat:@“%c”,[str characterAtIndex:++i]];
    }
    else if([str characterAtIndex:i]==delim)
    {
    [结果添加对象:[NSString stringWithString:currWord]];
    [文字发布];
    currWord=[[NSMutableString alloc]init];
    }
    其他的
    {
    [currWord appendFormat:@“%c”,[str characterAtIndex:i]];
    }
    }
    [结果添加对象:[NSString stringWithString:currWord]];
    [文字发布];
    返回[NSArray arrayWithArray:result];
    }
    
    谢谢,我几乎完成了对原始帖子中描述的内容的编码,但我认为您的解决方案更快、更容易实现。我很困惑,没有框架函数来实现这一点,我本以为它会更常见。谢谢,我几乎完成了对原始帖子中描述的内容的编码,但我认为您的解决方案很快呃,而且更容易实现。我很困惑,没有框架函数来实现这一点,我本以为它会更常见。