2012-10-26 11 views
5

私はObjective-Cで正規表現でかなり緑です。私はそれにいくつかの困難を抱えています。Objective-C NSRegularExpressionsは、文字列内の数字の最初の出現を見つけます。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b([1-9]+)\\b" options:NSRegularExpressionCaseInsensitive error:&regError]; 
if (regError) { 
    NSLog(@"%@",regError.localizedDescription); 
} 
__block NSString *foundModel = nil; 
[regex enumerateMatchesInString:self.model options:kNilOptions range:NSMakeRange(0, [self.model length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { 
    foundModel = [self.model substringWithRange:[match rangeAtIndex:0]]; 
    *stop = YES; 
}]; 

私が何をしているよすべては

150A 

のような文字列を取り、

150 

答えて

7

まず正規表現の問題点:

  1. あなたが唯一の (例えば15ではなく150A)自身である番号を探していることを意味ワード境界(\b)を使用しています。
  2. 番号の範囲には0が含まれていないため、150を取得できません。それは[0-9]+である必要がありますが、さらに良いのは\d+です。

これを修正するには、任意の数値をキャプチャする場合は、\d+が必要です。数字で始まるものをキャプチャしたい場合は、最初に単語境界を置くだけです\b\d+。あなたは
-[regex rangeOfFirstMatchInString:options:range:]

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b\\d+" options:NSRegularExpressionCaseInsensitive error:&regError]; 
if (regError) { 
    NSLog(@"%@",regError.localizedDescription); 
} 

NSString *model = @"150A"; 
NSString *foundModel = nil; 
NSRange range = [regex rangeOfFirstMatchInString:model options:kNilOptions range:NSMakeRange(0, [model length])]; 
if(range.location != NSNotFound) 
{ 
    foundModel = [model substringWithRange:range]; 
} 

NSLog(@"Model: %@", foundModel); 
+0

完璧です。ありがとうございました! – rnystrom

0

.*?(\d+).*?程度を取得するのですか?

Demo: これは数字を逆参照するため、必要な場合はどこでも使用できます。

+0

を使用することができます最初の発生を取得するために今すぐ

* '入力' 150A'最初 'となるよう、*最長*試合を行い、'として申し訳ありませんが、これは動作しませんが。 * 'は' 15 'にマッチし、 '(\ d +)'は '0'にマッチし、最後の'。* 'は' A'にマッチします。 – CRD

+0

申し訳ありませんが、私は "怠惰な"記号を忘れます –

+0

はい、*最短*マッチはそれを行いますが、最初のものだけが確実に必要ですか? (もちろん、@ Joe'sのようなパターンは、必要な数だけ良いものに合っていますが、それもそうする他のreがあります) – CRD

関連する問題