如何在iPhone应用程序中使用正则表达式以(逗号)分隔字符串

如何在iPhone应用程序中使用正则表达式以(逗号)分隔字符串,iphone,regex,csv,nsregularexpression,Iphone,Regex,Csv,Nsregularexpression,我必须读取有三列的.csv文件。在解析.csv文件时,我得到了以下格式的字符串:Christopher Bass,“哭吧,心爱的国家最后的文章”,cbass@cgs.k12.va.us。我想在一个数组中存储三列的值,所以我使用了componentSeparatedByString:@“,”方法!它正在成功地将包含三个组件的阵列返回给我: 克里斯托弗·巴斯 为心爱的国家呐喊最后一篇文章 cbass@cgs.k12.va.us 但是当列值中已经有逗号时,如下所示 克里斯托弗·巴斯,“哭泣,心爱的国家

我必须读取有三列的.csv文件。在解析.csv文件时,我得到了以下格式的字符串:Christopher Bass,“哭吧,心爱的国家最后的文章”,cbass@cgs.k12.va.us。我想在一个数组中存储三列的值,所以我使用了
componentSeparatedByString:@“,”
方法!它正在成功地将包含三个组件的阵列返回给我:

  • 克里斯托弗·巴斯
  • 为心爱的国家呐喊最后一篇文章
  • cbass@cgs.k12.va.us
  • 但是当列值中已经有逗号时,如下所示 克里斯托弗·巴斯,“哭泣,心爱的国家最后的论文”,cbass@cgs.k12.va.us 它将字符串分为四个部分,因为哭声后有一个(逗号):

  • 克里斯托弗·巴斯
  • 叫喊
  • 《心爱的国家》期末论文
  • cbass@cgs.k12.va.us
  • 那么,如何使用正则表达式来处理这个问题呢。我有“RegexKitLite”类,但我应该使用哪个正则表达式。请帮忙


    谢谢-

    任何正则表达式都可能出现相同的问题,您需要的是清理条目或字符串,方法是转义逗号或突出显示字符串:
    我的字符串“
    。否则你也会有同样的问题。祝你好运

    例如,您可能需要执行以下操作:

    \"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:@“\”
    应该为您提供以下信息:

  • 克里斯托弗·巴斯
  • 哭吧,亲爱的国家最后的文章
  • ,,cbass@cgs.k12.va.us
  • 然后使用
    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:@“\”使用引号而不是逗号将其打断。然后获取