web-dev-qa-db-ja.com

Objective-C:文字列内の数字を見つける

単語と数字を含む文字列があります。文字列からその番号を抽出するにはどうすればよいですか?

NSString *str = @"This is my string. #1234";

1234をintとして削除できるようにしたいと思います。文字列には、検索するたびに異なる数字と単語が含まれます。

アイデア?

38
Nic Hubbard

NSScanner ベースのソリューションは次のとおりです。

// Input
NSString *originalString = @"This is my string. #1234";

// Intermediate
NSString *numberString;

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

// Throw away characters before the first number.
[scanner scanUpToCharactersFromSet:numbers intoString:NULL];

// Collect numbers.
[scanner scanCharactersFromSet:numbers intoString:&numberString];

// Result.
int number = [numberString integerValue];

(多くのいくつかの)ここで行われた仮定:

  • 数字は0〜9、符号なし、小数点なし、桁区切りなしなどです。必要に応じてNSCharacterSetに符号文字を追加できます。
  • 文字列の他の場所に数字はありません。または、ある場合は、抽出したい数字の後にafterがあります。
  • 番号はintからオーバーフローしません。

または、intに直接スキャンすることもできます。

[scanner scanUpToCharactersFromSet:numbers intoString:NULL];
int number;
[scanner scanInt:&number];

#は、文字列内の数字の開始を示します。次の方法で見つけることができます。

[scanner scanUpToString:@"#" intoString:NULL];
[scanner setScanLocation:[scanner scanLocation] + 1];
// Now scan for int as before.
100
martin clayton

自己完結型ソリューション:

+ (NSString *)extractNumberFromText:(NSString *)text
{
  NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
  return [[text componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
}

以下のケースを処理します。

  • @ "1234"→@ "1234"
  • @ "001234"→@ "001234"
  • @ "先頭のテキストが削除されます001234"→@ "001234"
  • @ "001234末尾のテキストが削除されます"→@ "001234"
  • @ "a0b0c1d2e3f4"→@ "001234"

お役に立てれば!

46
Zorayr

IOS SDK 4以降で使用可能なNSRegularExpressionクラスを使用できます。

整数値を抽出する単純なコード("\ d +" regex pattern):

- (NSArray*) getIntNumbersFromString: (NSString*) string {

  NSMutableArray* numberArray = [NSMutableArray new];

  NSString* regexPattern = @"\\d+";
  NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:regexPattern options:0 error:nil];

  NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
  for( NSTextCheckingResult* match in matches) {
      NSString* strNumber = [string substringWithRange:match.range];
      [numberArray addObject:[NSNumber numberWithInt:strNumber.intValue]];
  }

  return numberArray; 
}
4
Farlei Heinen

この答え Stack Overflowから、トリックを行う素敵なCコードを探してください:

for (int i=0; i<[str length]; i++) {
        if (isdigit([str characterAtIndex:i])) {
                [strippedString appendFormat:@"%c",[str characterAtIndex:i]];
        }
}
3
Sam Ritchie

断然最高のソリューションです!私は正規表現の方が良いと思いますが、私はそれをちょっとサックスします;-)これはすべての数字をフィルタリングし、それらを一緒に連結して、新しい文字列を作成します。複数の数字を分割する場合は、少し変更します。そして、これを大きなループ内で使用すると、パフォーマンスが低下することを忘れないでください!

    NSString *str= @"bla bla bla #123 bla bla 789";
    NSMutableString *newStr = [[NSMutableString alloc] init];;
    int j = [str length];
    for (int i=0; i<j; i++) {       
        if ([str characterAtIndex:i] >=48 && [str characterAtIndex:i] <=59) {
            [newStr appendFormat:@"%c",[str characterAtIndex:i]];
        }               
    }

    NSLog(@"%@  as int:%i", newStr, [newStr intValue]);
1
Roger

NSPredicate は、 ICU正規表現 を使用して文字列を解析するためのCocoaクラスです。

0
Daniel Farrell

文字列から数値を取得するためのSwift拡張機能

extension NSString {

func getNumFromString() -> String? {

    var numberString: NSString?
    let thisScanner = NSScanner(string: self as String)
    let numbers = NSCharacterSet(charactersInString: "0123456789")
    thisScanner.scanUpToCharactersFromSet(numbers, intoString: nil)
    thisScanner.scanCharactersFromSet(numbers, intoString: &numberString)
    return numberString as? String;
}
}
0
Bhavesh Patel