web-dev-qa-db-ja.com

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

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

4つの質問:

  1. それは本当ですか?

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

  3. それでは、おすすめの素敵なオープンソースライブラリはありますか?

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

173
dreeves

IOS 4.0では、Appleが NSRegularExpressionクラス を提供していることに気付きました。さらに、10.7の時点で、クラスは利用可能です OS Xの下で

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

    (RegExKitLiteに対する私の不満は、カテゴリを介してNSStringを拡張することですが、機能と見なすこともできます。また、OSに同梱されている非公開ICUライブラリを使用します。

42
mfazekas

RegexKitは私が見つけた最高のものです。非常にココア:y。 iPhoneアプリのいくつかで「Lite」バージョンを使用しています。

sourceforge

lingonikorg

19
avocade

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

man 3 regex
11
Adam Wright

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

この手法が大量の繰り返し解析リクエストに対応できるかどうかはわかりませんが、トランザクションの処理が速い場合は、余分な外部リソースや理解できないコードに依存せずにジョブを実行できます。

8
Mark Caufman

NSRegularExpressionはMac OS X v10.7およびIOS 4.0以降で使用可能です。

6
bbaassssiiee

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

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

これは非常に軽量で、RegExKitよりもはるかに優れています(ただし、もちろん可能です)。

6
Rob Keniger

このトピックの検索中に、Ruby1.9とPHP5の背後にある正規表現エンジンである Oniguruma を使用する CocoaOniguruma に出会いました。既存の OregKit (日本語)と比べると少し新しいようです。これらが他のバインディングとどのように重なるかはわかりません。

4
newtonapple

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

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

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

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

Datasmidが述べたように、NSRegularExpressionはMac OS X v10.7およびIOS 4.0以降で利用可能です。

4
nickeyzzz

簡単にします。 Objective Cプロジェクトに新しいC++ファイルを追加し、.mmという名前に変更してから、内部に標準C++クラスを作成します。次に、NSStringを取得してNSString(またはNSArrayが必要な場合は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++がより少ないコード行で実行する場合があります。)

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

1
Volomike