我收到一个NSString
,它使用逗号作为分隔符,并使用反斜杠作为转义字符。我正在考虑使用componentsSeparatedByString
拆分字符串,但我发现无法指定转义字符。有没有内置的方法来做到这一点? NSScanner? CFStringTokenizer?
如果没有,最好将字符串拆分为逗号,然后重新加入被错误分割的标记(在检查结尾处的(非转义)转义字符之后)或循环遍历每个字符试图找到一个逗号,然后回顾一个字符以查看是否转义了逗号(然后再看一个字符以查看转义符是否被转义)。
现在我考虑一下,我需要检查分隔符之前的转义字符数是否均匀,因为只有才是分隔符本身没有被转义。
如果有人有这样做的方法,我会很感激,如果我可以看看它。
答案 0 :(得分:1)
我认为最直接的方法是按照你的建议逐字逐句地追逐字符串,附加到新的字符串对象中。您可以遵循两个简单的规则:
您可以手动执行此操作或使用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];
}