2012-12-19 19 views
6

2つのファイル(NSString形式)を区別しようとしています。私が知る限り、これは正規表現を比較して一致させることによって行うことができます。私が持っている2つのJPGファイルの形式は以下のとおりです。正規表現と文字列(ファイル名)の一致

butter.jpg

バター-1.JPG

私の質問私は2列に一致するように書くことができますどのような正規表現です上記?私は検索して式の例を見つけましたが、どのように読んで、それが間違っていると思いますか分かりません。ここで

は私のコードです:

NSString *exampleFileName = [NSString stringWithFormat:@"butter-1.jpg"]; 

NSString *regEx = @".*l{2,}.*";  

NSPredicate *regExTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx]; 

if ([regExTest evaluateWithObject:exampleFileName] == YES) { 
    NSLog(@"Match!"); 
} else { 
    NSLog(@"No match!"); 
} 

EDIT:

NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 

に一致するようにしようとする:

私は、次を使用してみました

NSString *exampleFileName = [NSString stringWithFormat:@"abcdefg-112323.jpg"]; 

でテスト:

ABC-11.jpg(マッチ)

abcsdas-.JPG(ノーマッチ)

abcdefg11。 (ノーマッチ)

ABCDEFG-3123.jpg(マッチ)

今のように、それは動作しますが、私はそうではないかもしれない任意のチャンス、任意の入力を排除したいですか?それは1 -と、少なくとも数を持つ必要があるよう

+0

あなたの一致基準をより詳細に説明する必要があります。なぜ、[exampleFileName hasPrefix:@ "butter"] && [exampleFileName hasSuffix:@ "。jpg"] 'と言うのはなぜですか? –

+0

こんにちは、すみません。私の基準は.jpgがそこになければならないということです。バターはアルファベットであればどこでもかまいません。しかしハイフンと数字はそこになければなりません。 – Dawson

答えて

4
NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 

は、butter.jpgのために失敗します。

NSString *regEx = @"[a-z]+(-[0-9]+){0,1}.jpg"; 

、あなたが

NSString *regEx = @"([a-z])+(?:-([0-9])+){0,1}.jpg"; 

を行う場合は、あなたはおそらく後でキャプチャグループとして持ちたい情報にアクセスすることができます。

(...)|かっこをキャプチャします。括弧で囲まれた部分式にマッチした入力の範囲は、マッチの後で利用可能です。

、あなたが必要といけない場合キャプチャグループ

NSString *regEx = @"(?:[a-z])+(?:-[0-9]+){0,1}.jpg"; 

(?:...)|カッコがない。含まれているパターンをグループ化しますが、一致するテキストのキャプチャは行いません。カッコを取り込むよりも効率的です。

+0

あまりにも多くの不要なキャプチャグループ... – nhahtdh

+0

返信ありがとう、私はbutter.jpgについて忘れました。あなたは{0,1}が意味するものを私に説明してもらえますか? – Dawson

+0

@nhahtdh - あなたが知っているOP情報にアクセスしたいですか? – vikingosegundo

2

\p{L}を使用してアルファベット文字(任意の言語)を一致させることができます。\dを使用して数字を照合することができます。正規表現では.は「任意の文字」を意味するため、.をエスケープする必要があります。

正規表現の解析にはコストがかかるため、一度だけ行う必要があります。

BOOL stringMatchesMyPattern(NSString *string) { 
    static dispatch_once_t once; 
    static NSRegularExpression *re; 
    dispatch_once(&once, ^{ 
     re = [NSRegularExpression regularExpressionWithPattern: 
      @"^\\p{L}+-\\d+\\.jpg$" options:0 error:NULL]; 
    } 

    return nil != [re firstMatchInString:string options:0 
     range:NSMakeRange(0, string.length)]; 
} 
関連する問題