如何在iPhone应用程序中使用正则表达式以(逗号)分隔字符串
我必须读取有三列的.csv文件。在解析.csv文件时,我得到了以下格式的字符串:Christopher Bass,“哭吧,心爱的国家最后的文章”,cbass@cgs.k12.va.us。我想在一个数组中存储三列的值,所以我使用了如何在iPhone应用程序中使用正则表达式以(逗号)分隔字符串,iphone,regex,csv,nsregularexpression,Iphone,Regex,Csv,Nsregularexpression,我必须读取有三列的.csv文件。在解析.csv文件时,我得到了以下格式的字符串:Christopher Bass,“哭吧,心爱的国家最后的文章”,cbass@cgs.k12.va.us。我想在一个数组中存储三列的值,所以我使用了componentSeparatedByString:@“,”方法!它正在成功地将包含三个组件的阵列返回给我: 克里斯托弗·巴斯 为心爱的国家呐喊最后一篇文章 cbass@cgs.k12.va.us 但是当列值中已经有逗号时,如下所示 克里斯托弗·巴斯,“哭泣,心爱的国家
componentSeparatedByString:@“,”
方法!它正在成功地将包含三个组件的阵列返回给我:
谢谢-任何正则表达式都可能出现相同的问题,您需要的是清理条目或字符串,方法是转义逗号或突出显示字符串:
我的字符串“
。否则你也会有同样的问题。祝你好运
例如,您可能需要执行以下操作:
\"Christopher Bass\",\"Cry\, the Beloved Country Final Essay\",\"cbass@cgs.k12.va.us\"
这样,您就可以使用regexp,甚至可以使用NSString
类中的相同方法
一点也不相关,但是消毒字符串的重要性:呵呵。您正在搜索的正则表达式是:
\\“(.*)\\”[^,]*|([^,]*),
在ObjC中:(“\”&&string_1&&“\”&&0-n空格)| | string_2,逗号除外)&&comma
NSString *str = @"Christopher Bass,\"Cry, the Beloved Country ,Final Essay\",cbass@cgs.k12.va.us,som";
NSString *regEx = @"\\\"(.*)\\\"[ ^,]*|([^,]*),";
NSMutableArray *split = [[str componentsSeparatedByRegex:regEx] mutableCopy];
[split removeObject:@""]; // because it will print always both groups even if the other is empty
NSLog(@"%@", split);
// OUTPUT:
2012-02-07 17:42:18.778 tmpapp[92170:c03] (
"Christopher Bass",
"Cry, the Beloved Country ,Final Essay",
"cbass@cgs.k12.va.us",
som
)
RegexKitLite会将这两个字符串添加到数组中,因此数组将以空对象结束removeObject:@“
将删除这些值,但如果您需要保留真正的空值(例如,您的源代码具有val,,ue
),则必须将代码修改为以下内容:
str = [str stringByReplacingOccurrencesOfRegex:regEx withString:@"$1$2∏"];
NSArray *split = [str componentsSeparatedByString:@"∏"];
$1和$2是上面提到的两个字符串,∏ 在这种情况下,是一个很可能永远不会出现在普通文本中的字符(并且很容易记住:option-shift-p)。标题是否保证有引号?它是唯一可以拥有它们的组件吗?因为
componentSeparatedByString:@“\”
应该为您提供以下信息:
componentSeparatedByString:@“、”
或substringFrom/ToIndex:
删除第一个和最后一个组件中的两个逗号
下面是一个使用子字符串的解决方案:
NSString* input = @"Christopher Bass,\"Cry, the Beloved Country Final Essay\",cbass@cgs.k12.va.us";
NSArray* split = [input componentsSeparatedByString:@"\""];
NSString* part1 = [split objectAtIndex:0];
NSString* part2 = [split objectAtIndex:1];
NSString* part3 = [split objectAtIndex:2];
part1 = [part1 substringToIndex:[part1 length] - 1];
part3 = [part3 substringFromIndex:1];
NSLog(part1);
NSLog(part2);
NSLog(part3);
最后一部分看起来永远不会包含逗号。就我所知,第一部分也不会 像这样拆分字符串怎么样:
NSArray *splitArr = [str componentsSeparatedByString:@","];
NSString *nameStr = [splitArr objectAtIndex:0];
NSString *emailStr = [splitArr lastObject];
NSString *contentStr = @"";
for(int i=1; i<[splitArr count]-1; ++i) {
contentStr = [contentStr stringByAppendingString:[splitArr objectAtIndex:i]];
}
NSArray*splitArr=[str componentsSeparatedByString:@“,”];
NSString*nameStr=[splitArr objectAtIndex:0];
NSString*emailStr=[splitArr lastObject];
NSString*contentStr=@;
对于(inti=1;i
componentsSeparatedByRegex:@",\\\"|\\\","
这应该将字符串拆分为“
和,
以任意顺序同时出现,从而形成一个三人数组。当然,这假设字符串中的第二个元素总是用括号括起来,字符“
和,
在这三个组件中不会连续出现
如果这些假设中的任何一个不正确,则可以使用其他方法来识别字符串组件,但应该明确的是,不存在通用解决方案。如果三个组件字符串可以包含“
和,
任何位置,则在这种情况下,甚至不可能使用有限的解决方案:
Doe, John,\"\"Why Unescaped Strings Suck\", And Other Development Horror Stories\",Doe, John <john.doe@dev.null>
Doe,John,\“\”为什么未替换的字符串很糟糕\”和其他开发恐怖故事\“,Doe,John
希望您的CSV数据中没有类似的内容。如果有,数据基本上是不可用的,您应该寻找更好的CSV导出器。它需要是regexp还是“低技术”“解决方案可以接受吗?@dasblinkenlight:如果你有其他解决方案,我也会很感激。嘿,你能把你的csv文件发给我吗???我想你遗漏了什么。你的csv字符串应该是这样的:<代码>>“克里斯托弗·巴斯”,“哭泣,心爱的国家最后的论文”,\”cbass@cgs.k12.va.us\"
@Inder Kumar Rathore是的,我可以发送给你,但是如何发送?还有你的第二条评论!不,我没有遗漏任何东西。csv字符串应该与你所写的一样,但是当我解析在Windows上创建的CV时,它显示了我在上面所写的方式中不会有任何问题,我可以用“\”分隔字符串,\”,它工作得很完美,但它不会发生!如果有10000名用户正在使用该应用程序在数据库中输入数据呢?你说的“什么”是什么意思?为了理解这个问题,我需要一些上下文和背景知识。在你的回答中,你一个接一个地去掉了逗号,我想你是在说数据内容中不应该有逗号和引号!如果有超过10000个用户,我如何控制这一点?哇,完全错过了那个。如果这些是新的尝试访问csv文件的数据库时,您可以“转义”字符串中的逗号,并使用文件中的逗号分隔列。如果您已经有一个拥有10k用户的csv文件,那么我认为此解决方案不适用于您:很抱歉。如果我使用componentSeparatedByString:@“然后,位置2的文本将分为两部分。那么,我将如何跟踪这两个分开的部分属于哪一行?请重新阅读答案-想法是在位置2的文本上根本不要使用componentSeparatedByString:@“\”。使用componentSeparatedByString:@“\”使用引号而不是逗号将其打断。然后获取