Xcode如何在两个子串中拆分子串

时间:2013-06-06 14:29:42

标签: nsstring nsarray substring

我有NSString。此NSString";"的不同部分中分开。

我将此NSString拆分为2个子字符串([componentsSeparatedByString:@";"]

现在,我在[componentsSeparatedByString:@";"]中有一个带NSArray的子字符串。 在这个子字符串中,我有(有时但并不总是!)a ","

当我有","时,我想在两个“子子串”中填充我的子串并使用这两个子子串......

我该怎么做?

感谢您的回答。

编辑:

你好@Alladinian,谢谢你的回答。 我认为这是我需要的循环。我想用QRCode添加到iPhone地址簿(名字和姓氏)的新联系人。

我的NSString看起来像是:

NSString *_name = [NSString stringWithFormat:@"%@", code.contact];

我的子字符串如下:

NSArray *subStrings = [code.contact componentsSeparatedByString:@";"];

在我的NSString中,我(可能但不总是)","我需要两个不同的输出:一个用于名字,一个用于姓氏。

我知道如何添加由","分隔的名字和姓氏,但如果我只有名字,我不知道该怎么办。我的应用程序只有一个名字崩溃...

现在,为了解决问题,我在拳头名字字段中发送拳头名字和姓氏......但这对我来说并不完美。

1 个答案:

答案 0 :(得分:1)

好的,这里有一些你可以使用的代码。您不能仅使用componentsSeparatedByString作为名称,因为有4种情况:

  • 没有逗号:假设只是第一个名字"第一个"
  • 逗号,但没有姓氏",第一个"
  • 逗号,但没有名字"最后,"
  • 逗号,两者:" last,first"

代码:

NSString * mecardString = ...your string...

if ( [ mecardString hasPrefix:@"MECARD:" ] ) // is it really a card string? (starts with 'MECARD:')
{
    mecardString = [ mecardString substringFromIndex:[ @"MECARD:" length ] ] ;  // remove MECARD: from start

    NSString * firstName = nil ;
    NSString * lastName = nil ;

    NSArray * components = [ mecardString componentsSeparatedByString:@";" ] ;
    for( NSString * component in components ) // process all parts of MECARD string
    {
        NSString * lcString = [ component lowercaseString ] ;
        if ( [ lcString hasPrefix:@"n:" ] )
        {
            // handle name ("N:")
            NSRange commaRange = [ lcString rangeOfString:@"," ] ;
            if ( commaRange.location == NSNotFound )
            {
                firstName = lcString ;
            }
            else
            {
                firstName = [ lcString substringFromIndex:NSMaxRange( commaRange  ) ] ;
                lastName = [ lcString substringToIndex:commaRange.location ] ;
            }

            NSCharacterSet * whitespaceCharSet = [ NSCharacterSet whitespaceAndNewlineCharacterSet ] ;
            firstName = [ firstName stringByTrimmingCharactersInSet:whitespaceCharSet ] ;
            lastName = [ firstName stringByTrimmingCharactersInSet:whitespaceCharSet ] ;
        }
        else if  ( lcString hasPrefix:@"sound:" )
        {
            // handle name ("SOUND:")
        }
            // ... write code handle other parts of MECARD... (NICKNAME, BDAY, URL, etc)
        else
        {
            // handle unknown case here
        }
    }

    // you have names here
}