6

2 つのファイル (NSString 形式) を区別しようとしています。私の知る限り、これは正規表現を比較して照合することで実行できます。私が持っている2つのjpgファイルの形式は次のとおりです。

バター.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!");
}

編集:

私は以下を使用してみました:

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

一致を試みるには:

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

テスト済み:

abc-11.jpg (マッチ)

abcsdas-.jpg (一致なし)

abcdefg11. (歯が立たない)

abcdefg-3123.jpg (一致)

今のところ機能していますが、機能しない可能性を排除したいのですが、入力はありますか?

4

2 に答える 2

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

butter.jpgは、1 つ以上の数が必要なため、失敗し-ます。

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"; 

(?:...)| 非キャプチャ括弧。含まれているパターンをグループ化しますが、一致するテキストのキャプチャは提供しません。括弧をキャプチャするよりもいくらか効率的です。

于 2012-12-19T08:35:49.097 に答える
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)];
}
于 2012-12-19T08:44:10.433 に答える