初期グーグルは、Objective-C Cocoaアプリケーションで正規表現を実行する組み込みの方法がないことを示しています。
4つの質問:
それは本当ですか?
私をからかってるの?
それでは、おすすめの素敵なオープンソースライブラリはありますか?
NSScannerクラスを使用して、ライブラリをインポートせずに十分に近づく方法は何ですか?
IOS 4.0では、Appleが NSRegularExpressionクラス を提供していることに気付きました。さらに、10.7の時点で、クラスは利用可能です OS Xの下で 。
RegExKitLite たとえば、ライブラリは必要ありません。プロジェクトに.mと.hを追加するだけです。
(RegExKitLiteに対する私の不満は、カテゴリを介してNSStringを拡張することですが、機能と見なすこともできます。また、OSに同梱されている非公開ICUライブラリを使用します。
POSIX正規表現ライブラリを使用できます(POSIX準拠のOSの場合)。試して
man 3 regex
REGEXおよびJSON解析の問題を解決するために使用する安価で汚いハックソリューションは、UIWebViewオブジェクトを作成し、解析を行うためにJavascript関数を挿入することです。次に、javascript関数は、値の文字列(または値のリスト)を返します。実際、特定のタスク用にカスタマイズされた関数の小さなライブラリセットを保存し、必要に応じてそれらを呼び出すことができます。
この手法が大量の繰り返し解析リクエストに対応できるかどうかはわかりませんが、トランザクションの処理が速い場合は、余分な外部リソースや理解できないコードに依存せずにジョブを実行できます。
NSRegularExpression
はMac OS X v10.7およびIOS 4.0以降で使用可能です。
PCRE構文に慣れている場合に便利な、PCREを使用するAGRegexフレームワークが好きです。このフレームワークの最良のバージョンは、PCRE 6.7を使用するためにアップグレードされたColloquy IRCクライアントのバージョンです。
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
これは非常に軽量で、RegExKitよりもはるかに優れています(ただし、もちろん可能です)。
このトピックの検索中に、Ruby1.9とPHP5の背後にある正規表現エンジンである Oniguruma を使用する CocoaOniguruma に出会いました。既存の OregKit (日本語)と比べると少し新しいようです。これらが他のバインディングとどのように重なるかはわかりません。
グーグルで少し、このライブラリを見つけました: RegexOnNSString
次のような関数を含むオープンソースライブラリ:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
NSRegularExpression
クラスを使用します。非常に使いやすく、何も心配する必要はありません。
Datasmidが述べたように、NSRegularExpression
はMac OS X v10.7およびIOS 4.0以降で利用可能です。
簡単にします。 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ラッパーを作成することです。