【问题标题】:Reformat NSString in Objective-C [duplicate]在Objective-C中重新格式化NSString [重复]
【发布时间】:2013-02-26 16:43:09
【问题描述】:

我有以下 NSString,然后我想将其分成两部分:

NSString *tmpString = @"Mike <test@gmail.com>";

我想从中创建两个字符串,如下所示:

NSString *tmpString1 = @"Mike";
NSString *tmpString2 = @"test@gmail.com";

如何在 Objective-C 中实现这一点?提前致谢!

【问题讨论】:

  • 使用NSString的方法componentsSeparatedByString或者使用NSScanner
  • 真正的问题是您是要在空间上拆分还是要解析符合 RFC-822(或更高版本)的电子邮件地址。如果是后者,以下答案均不正确。
  • @bbum RFC-822 和普通邮件地址有什么区别?
  • 无论您做什么,我都建议您进行单元测试,通过您的代码提供大量电子邮件地址列表。有时,抓取您的垃圾邮件箱可能会很有用。

标签: iphone ios objective-c cocoa-touch nsstring


【解决方案1】:

就是这样处理的,

NSArray *tmpArray = [@"Mike <test@gmail.com>" componentsSeparatedByString:@"<"];
NSString *tmpString1 = [tmpArray objectAtIndex: 0];
NSString *tmpString2 = [tmpArray objectAtIndex: 1];

tmpString2 = [tmpString2 stringByReplacingOccurrencesOfString:@">" withString:@""];
tmpString1 = [tmpString1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

【讨论】:

  • 不用感谢,即使我解决了这个问题,但你的答案更好,比我短。
  • 此解决方案将失败,并出现以下字符串:Mike Smith &lt;test@foo.com&gt; 或地址行test@foo.com。并非所有电子邮件地址都有显示名称。
  • 我邀请您检查新代码,
  • 不适用于 "much.more different"@example.com,这是一个有效的(虽然很奇怪)地址。迂腐,是的,但标准的存在是有原因的。
  • @SergiusGee,谢谢伙计!
【解决方案2】:

有几种方法可以做你想做的事。

您可以在空格 (-[NSString componentsSeparatedByString:]) 上拆分字符串,然后用 -[NSString stringByTrimmingCharactersInSet:] 修剪掉多余的 &lt;&gt;

您可以使用-[NSString rangeOfString:] 查找字符&lt;&gt; 的索引,并使用-[NSString substringToIndex:]-[NSString substringWithRange:] 复制出子字符串。

另一种方法是使用NSScanner

NSScanner *scanner = [NSScanner scannerWithString:tmpString];
[scanner scanUpToString:@" <" intoString:&tmpString1];
[scanner scanUpToString:@">" intoString:&tmpString2];

【讨论】:

    【解决方案3】:

    如果您想在一行代码中完成此操作,请按以下方法...

    注意:我使用与您使用的格式完全相同的正则表达式成功地使用了它。在我看来,这有点简单,可以通过我的示例中所示的一行代码来实现。如果您的格式发生变化,您只需对正则表达式进行非常小的更改:

    NSArray *nameComponents = [@"Mike <test@gmail.com>" componentsSeparatedByRegex:@"\\s<(.*)>"];
    NSLog(@"included in nameComponents array: %@", nameComponents);
    

    输出:

    2013-02-26 11:34:55.238 TestProject[39086:1c403] 包含在 nameComponents 数组中:( 麦克风, “test@gmail.com” )

    当然,该示例假设您使用严格的格式“[name][space]”。但是,如前所述,任何格式更改都只是调整正则表达式的简单问题。

    【讨论】:

      【解决方案4】:

      您需要将字符串分解为:

      NSString *tmpString = @"Mike <test@gmail.com>";
      
      NSArray *breakIntoStrings=[tmpString componentsSeperatedByString:@"<"];
      //[0]=Mike
      //[1]=test@gmail.com>
      
      NSString *tmpString1 = breakIntoStrings[0];
      NSString *tmpString2 = [breakIntoStrings[1] substringToIndex:[breakIntoStrings[1] length] - 1];
      
      //now tmpString1 contains white space at end. you can trim it by:
      
      tmpString1 = [tmpString1 stringByTrimmingCharactersInSet:
                                    [NSCharacterSet whitespaceCharacterSet]];
      

      【讨论】:

        【解决方案5】:

        根据您的要求有不同的方法来实现这一点,但是当您使用componentsSeparatedByString 时,它会返回一个NSArray 对象,而不是NSString,您可以使用该数组来获取索引字符串,

        NSArray *mainStrArray = [str componentsSeparatedByString:@"<"];
        

        现在您的数组包含索引 0 处的值 Mike 和索引 1 处的 test@gmail.com>

        // 获取mike,去掉后面的空格

        NSString *stringMike=[[mainStrArray objectAtIndex:0] stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceCharacterSet]];
        

        // 再次迭代另一部分以获得剩余的字符串..

        NSArray *tmpArray=[[mainStrArray objectAtIndex:1] componentsSepratedByString:@">"];
        

        // 你会得到 at index 0 test@gmail.com //再次解析它的第一部分

        NSString *testStr=[tmpArray objectAtIndex:0];
        

        我之前在评论中提到的其他替代方案是NSScanner

        【讨论】:

          猜你喜欢
          • 2023-04-08
          • 2012-02-07
          • 1970-01-01
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 2018-07-28
          • 2013-02-25
          • 2015-11-05
          相关资源
          最近更新 更多