Objective-C Cocoaアプリケーションでの正規表現


173

最初のグーグルは、Objective-C Cocoaアプリケーションで正規表現を実行する組み込みの方法がないことを示しています。

したがって、4つの質問:

  1. それは本当ですか?

  2. 私をからかってるの?

  3. さて、あなたがお勧めする素敵なオープンソースライブラリはありますか?

  4. おそらくNSScannerクラスを使用して、ライブラリをインポートせずに十分に近づける方法は何ですか?


4
うーん...モノタッチを使うとどうなるのかな。質問の+1。
Dan Rosenstark

回答:



42
  1. はい、Cocoaには正規表現のサポートはありません。ブールマッチングにのみ関心がある場合は、ICU正規表現構文をサポートするNSPredicateを使用できます。しかし、通常は、一致の位置または部分式の位置に関心があり、NSPredicateではそれを取得できません。
  2. 前述のように、正規表現のPOSIX関数を使用できます。しかし、それらは遅いと見なされ、正規表現構文は他のソリューション(ICU / pcre)と比較して制限されています。
  3. 多くのOSSライブラリがあり、CocoaDevには広範なリストがあります。
  4. たとえばRegExKitLiteはライブラリを必要とせず、プロジェクトに.mと.hを追加するだけです。

    (RegExKitLiteに対する私の不満は、カテゴリーを介してNSStringを拡張することですが、これも機能と見なすことができます。また、OSに付属する非公開のICUライブラリを使用します。これはAppleによって推奨されていません。)


3
POSIXの正規表現関数はUnicodeでは機能しないことに注意してください(ASCIIのみ)。
トムダリング2009

NSPredicateのURLが壊れたリンクであることに注意してください
テーバー

11
iOSは、部分文字列検索の正規表現をサポートしています。例[myString rangeOfString:@"regex_here" options:NSRegularExpressionSearch]
Nestor

1
Lion(10.7)でも利用可能#if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED
Maciej Swic '25 / 07/25

非公開のICUライブラリを使用するのは問題ないと思います。なぜなら、それを使用する必要がある場合は、Cocoaのバージョンに組み込みの正規表現サポートがないためです。これらのライブラリを使用する場合は、サポートされていないため変更されない古いシステム用にビルドしていることも意味します。古いものと新しいものの両方を構築する場合、NSRegularExpressionが存在しない場合は、RegExKitLiteをフォールバックとして使用します。(はい、まだ古いシステムで作業している人がいます)。


12

POSIX正規表現ライブラリを使用できます(POSIX準拠のOSの場合)。試す

man 3 regex

ああなるほど。これは、ストレートCでそれを行う方法です。これは、おそらく任意のObjective-Cアプリで機能するはずです。かっこいい、ありがとう!これは基本的にこれを行う方法として受け入れられていますか?
2009年

これは、追加の依存関係を必要としない方法です。インポートできるオープンソースライブラリの点で他の選択肢があります(PCRE、Perl正規表現の場合、Obj-C ++を使用している場合はBoost RegExライブラリ、または他の回答にリストされている他のライブラリ)。
アダムライト

ストレートCとObjective-Cを混在させるデメリットはありますか?NSStringとの間で変換するためのコードスニペットを含めることができますか?再度、感謝します!
2009年

Objective-CはCの上に構築されているので、実際には何も混ぜません。ただし、ライブラリは使いやすいAPIを備えているため、ほとんどの人がライブラリを使用しています。
マークシャルボノー

5
また、POSIX正規表現関数はASCII文字列でのみ機能します。
トムダリング2009

8

REGEXとJSONの解析問題を解決するために使用する安価で汚れたハックソリューションは、UIWebViewオブジェクトを作成し、解析を実行するJavaScript関数を挿入することです。次に、javascript関数は、気になる値(または値のリスト)の文字列を返します。実際、特定のタスク用にカスタマイズされた関数の小さなライブラリセットを保存して、必要に応じて呼び出すだけで済みます。

この手法が大量の繰り返し解析要求に対応できるかどうかはわかりませんが、トランザクションの処理を迅速に行うには、理解できない余分な外部リソースやコードに依存することなく、作業を完了できます。


7

PCREを使用するAGRegexフレームワークが好きです。PCRE構文に慣れている場合に便利です。PCRE 6.7を使用するようにアップグレードされているため、このフレームワークの最適なバージョンはColloquy IRCクライアントのバージョンです。

http://colloquy.info/project/browser/trunk/Frameworks/AGRegex

これは非常に軽量で、RegExKitよりもはるかに軽量です(もちろん、それほど能力はありません)。


完全なperl互換の正規表現を使用していると、なぜ機能が低下するのですか?
2009年

関連するObjective-Cヘルパーメソッドは、RegExKitのメソッドほど広範囲ではありませんが、ほとんどの目的には適しています。
Rob Keniger、2009年


5

このトピックの私の検索の間に私は出くわしたCocoaOniguruma使用しています鬼車、Ruby1.9とPHP5の後ろに正規表現エンジンを。既存のOregKitと比べて少し新しいようです。これらが他のバインディングとどのように重なっているかはわかりません。


4

少しググって、このライブラリを見つけました: RegexOnN​​SString

次のような関数を含むオープンソースライブラリ:

-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase

NSRegularExpressionクラスを使用します。非常に使いやすく、何も心配する必要はありません。

NSRegularExpressionDatasmidが言及したように、Mac OS X v10.7およびIOS 4.0以降で利用可能であることに注意してください。


1

簡単にします。Objective Cプロジェクトに新しいC ++ファイルを追加し、名前を.mmに変更してから、内部に標準C ++クラスを作成します。次に、NSStringを受け取り、NSString(または、必要な場合はNSArray)を返すC ++関数の「public:」セクションで静的クラスメソッドを作成します。次に、NSStringをC ++ std :: stringに変換します。

// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
  std::string sTemp([sInput UTF8String]);
  s = sTemp;
}

そこから、regex_replaceを次のように使用できます。

// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);

次に、そのstd :: stringをNSStringに変換して戻すことができます。

NSString *sResponse2 = @(sResult.c_str());

このC ++だけをこの関数で使用している場合は、このファイルextra.mm(クラス名Extra)を呼び出してこの静的クラスメソッドを配置し、状況が発生したときに他の静的クラスメソッドを追加するのが適切な場合があります。場合によっては手間が少ないため、C ++でそれを行うのが理にかなっています。(ObjCが少ないコード行で何かを行う場合と、C ++が少ないコード行で行う場合があります。)

PSこれのさらに別の方法は、.mmファイルを使用することですが、std :: stringとstd :: regex_replace()(またはregex_match())の使用に関連するObjective Cラッパーを作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.