NSPredicateでの正規表現について。その2

NSPredicateでの正規表現について。 » サイキョウライン

自分の理解では万策尽きてしまったので、どなたか教えてください。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches '.*\\\\D+?.*'"];
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]);        //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"#12345"]);         //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"あいうえお"]);     //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"1234A56"]);        //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0

某所で指摘していただいて「\\\\D+」→「.*\\\\D+?.*」として解決できそうだったのですが、新たな問題が。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches '.*\\\\D+?.*'"];
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]);        //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0

え?なんなの?¥dと¥Dは全角半角関係ないの?どこ仕様?それどこ仕様よ?

コメント

  1. 普通に以下ではだめでしょうか?
    [^0-9]+

    (逆に\Dみたいなキモいの使ったことなかったので…)

  2. yoshuki より:

    コメントありがとうございます。
    残念ですが[^0-9]でも結果は変わりませんでした。
    0-9が0から9にも0から9にもヒットしてしまうのが元凶のようです。

  3. なるほど。Ruby では区別されてますね。http://rubular.com/r/nQV3wKZnmz
    正規表現の方言にやられたっぽいですね。

    [^\u{0030}-\u{0039}]+ ならどうでしょう? Ruby では正常に動きます http://rubular.com/r/g0Y0sjyvDT

    それでもだめなら外部の正規表現ライブラリを導入するという手が考えられます。

  4. yoshuki より:

    ありがとうございます。結果から言うと「\u0030」が「0」にも「0」にもマッチしてしまいました。
    こうなってしまうともう意味が分かりません。

  5. さっき移動中だったのでこっちを今見ました。

    これはわけわかですね。いずれにしろ数字の指定に内部で勝手に[\p{Nd}]相当のことをやってしまうのは、実装上非常に問題だという気がしてきました。

    いろんな正規表現ライブラリを試してみましたが、言語付属の正規表現ライブラリはたいてい機能が中途半端だったり勝手な拡張していたりとトラブルの原因でした。RubyのOnigmoはかなりよい方で、愛用してます。(perlは使ってないのでわかりません)。
    スピードは遅いですが、.NET Frameworkの正規表現もかなり優秀です。

    スピードではPowerGrepという有料ツールはもう圧倒的ですが、微妙にバグがありました。新しいのにアップグレードすると直るかもしれませんが。

タイトルとURLをコピーしました