2012-03-08 11 views
1

私は数字と数字だけを含む行を抽出したいデータの配列を持っています。行の例:NSPredicateは数字以外のものを一致させます

15、+2、 ''、7、9、21

は( '' 一つ以上の空白を表します)。この場合

私は唯一の15、7、9、私は次のように述語を使用を抽出したいと思います:

NSString *pattern = @"[^0-9]"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; 
if (![predicate evaluateWithObject:myStringToMatch]) 
// Extract ... 

私はオンライン正規表現テスターを使用して、私のパターンをテストし、[^ことを発見しました0-9]は0-9の数字以外は何も一致しません。しかし、上記のコードを実行すると、空白と一致するだけで、例えば+2ではなく、私はそれがすべきだと確信しています。明確にするために、myStringToMatchはNSStringオブジェクトです。

なぜ私のパターンにマッチしないのか分かりません。誰かが私が間違っていることにヒントを与えることができますか?

ありがとうございました。

答えて

5

正規表現では、1桁以外の文字は一致しません。数字と数字のみを含む行を一致させる場合は、ではない正規表現が必要です。は数字以外の数字を含む行で一致します。

次の正規表現を使用することができます:^[0-9]+$。 1つ以上の行(+)の数字([0-9])と一致し、他には何もありません。(アンカー^および$がこれを保証します)。同様の答えのための

if ([predicate evaluateWithObject:myStringToMatch]) 
// note the absence of negation operator 
// Extract ... 
+0

ありがとうございました。私は、正規表現のバリデータの出力を誤って解釈した可能性があります。 ^(〜[0-9])の前と([^ 0-9])の数字の違いを教えてください。 –

+1

'^'は最初のもので、 '$'は* whole * regexの最後の文字としていわゆるアンカーです:http://www.regular-expressions.info/anchors.html。 '[a]'は 'a'を除くすべての文字にマッチするのに対し、 '[a]'は一文字 'a'にマッチします: http://www.regular-expressions.info/charclass.html –

+0

もう一度ありがとうございます。それはそれをクリアした。 –

2

いいえ、あなたの正規表現はという数字以外は一致しません。

あなたは、文字列が数字のみが含まれているかどうかをテストするには、次のコードを使用することができます:「2」と、以下の文字列の21と非空:

NSRegularExpression *r = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:0 error:nil]; 

NSArray *result = [r matchesInString:s options:0 range:NSMakeRange(0, s.length)]; 

結果は文字列のために空になります。あなたが好きならば、あなたは述語と同じ正規表現を使用することができます。また

if ([r matchesInString:s options:0 range:NSMakeRange(0, s.length)].length) { 
    // Extract ... 
} 

:15、7、9

は、だからあなたのコードは、に変更することができます。

+0

おかげで、@sch:

はその後、代わりに一致しないフィルタリング行の、あなたは何行のみを処理します。この特定のケースでは、NSPredicateを使用する方が簡単であることがわかりました。 NSRegularExpressionとNSPredicateの長所/短所を教えてください。より複雑な正規表現を扱うときは、nsregexが優れていますか? –

関連する問題