【问题标题】:Extract substring from a string in iOS?从iOS中的字符串中提取子字符串?
【发布时间】:2013-08-01 10:36:02
【问题描述】:

有没有办法从下面的字符串中提取子字符串

我的真实字符串是“NS09A”或“AB455A”,但我只想要“NS09”或“AB455”(直到原始字符串数字部分的末尾)。

我怎样才能提取这个?

我看到谷歌搜索答案,比如使用子字符串的开始和结束部分的位置,我们可以提取它,但这里“字母+数字+字母”的任意组合。我只需要“字母+数字”

【问题讨论】:

  • 字符串总是“alpha”、“numeric”、“alpha”吗?
  • 不,有些情况是这样的,正常情况下是“alpha”+“numeric”

标签: ios objective-c nsstring substring


【解决方案1】:

也许不是每个人都会同意,但我喜欢正则表达式。他们允许指定 正是您正在寻找的:

NSString *string = @"AB455A";

// One or more "word characters", followed by one or more "digits":
NSString *pattern = @"\\w+\\d+";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                       options:0
                                     error:NULL];
NSTextCheckingResult *match = [regex firstMatchInString:string
                        options:NSMatchingAnchored
                          range:NSMakeRange(0, [string length])];
if (match != nil) {
    NSString *extracted = [string substringWithRange:[match range]];
    NSLog(@"%@", extracted);
    // Output: AB455
} else {
    // Input string is not of the expected form.
}

【讨论】:

    【解决方案2】:

    试试这个:-

    NSString *str=@"ASRF12353FYTEW";
    NSString *resultStr;
    for(int i=0;i<[str length];i++){
        NSString *character = [str substringFromIndex: [str length] - i];
        if([character intValue]){
            resultStr=[str substringToIndex:[str length]-i+1];
            break;
        }
    }
    NSLog(@"RESUKT STRING %@",resultStr);
    

    【讨论】:

      【解决方案3】:

      我测试了这段代码:

         NSString *originalString = @"NS09A";
      
          // Intermediate
          NSString *numberString;
          NSString *numberString1;
      
      
          NSScanner *scanner = [NSScanner scannerWithString:originalString];
          NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
      
      
          [scanner scanUpToCharactersFromSet:numbers intoString:&numberString];
      
          [scanner scanCharactersFromSet:numbers intoString:&numberString1];
      
          NSString *result=[NSString stringWithFormat:@"%@%@",numberString,numberString1];
      
          NSLog(@"Finally ==%@",result);
      

      希望对你有帮助

      输出

      Finally ==NS09
      

      更新:

      NSString *originalString = @"kirtimali@gmail.com";
      
      NSString *result;
      NSScanner *scanner = [NSScanner scannerWithString:originalString];
      NSCharacterSet *cs1 = [NSCharacterSet characterSetWithCharactersInString:@"@"];
      
      [scanner scanUpToCharactersFromSet:cs1 intoString:&result];
      
      NSLog(@"Finally ==%@",result);
      
      output:
      Finally ==kirtimali
      

      【讨论】:

      • @Kirti Mali 如何在邮件验证中使用子字符串。我喜欢将子字符串增加到@Ex: mailname@gmail.com 表示我只想要mailname。你能用这个解决方案编辑你的帖子吗?
      【解决方案4】:

      使用NSScannerscanUpToCharactersFromSet:intoString: 方法指定应该使用哪些字符来停止解析。如果您已经有一种方法可以找到要提取的每个部分的开头,则这可能是带有某些逻辑的循环,也可以与 setScanLocation: 一起应用。


      当使用scanUpToCharactersFromSet:intoString: 时,您正在寻找下一个无效字符。它不需要是“特殊”字符(在 unicode 意义上),只是一组对您想要的内容无效的已知字符。所以,你可以使用:

      [[NSCharacterSet characterSetWithCharactersInString:@"1234567890"] invertedSet]
      

      【讨论】:

      • 我可以提一下我用数字而不是特殊字符来停止
      【解决方案5】:

      您可以在NSString 类上使用- (NSString *)substringWithRange:(NSRange)aRange 方法来获取提取的子字符串。使用NSMakeRange 创建NSRange 对象。

      【讨论】:

      • 为什么要投反对票?它回答了提取子字符串的问题。
      • 我认为,投票被否决了,因为您的回答告诉我们使用范围来提取子字符串。在这个问题中,没有特定的范围。需要先找到范围,然后进行修剪操作,直到它。
      • @Navi 你不应该因为它是一个答案而投票赞成答案。如果您认为这是一个好的答案,请投票。
      猜你喜欢
      • 2023-04-10
      • 2011-07-21
      • 1970-01-01
      • 2018-09-29
      • 2021-12-23
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      相关资源
      最近更新 更多