2012/07/20更新

[XCODE] iOSで正規表現を扱う方法と、HTMLに正規表現を使ったサンプル

このエントリーをはてなブックマークに追加            

こんにちは、最近良く正規表現にお世話になる @yoheiMuneです。
本日は、iPhoneアプリ開発で正規表現を使う方法と具体例をブログに書きたいと思いますっ!

RegularExpression in Objective-C



iOSにおける正規表現を行うステップ

いままでPHP、JavaScript、Javaなどで正規表現を使ってきた経験はあったのですが、 Objective-Cでは経験がなく。調べてみたら、他の言語よりちょっと行数がかかりそうな事を発見。
今回は、そのやり方を忘れないようにと備忘も兼ねて、ブログに書きました。

具体的なステップは、以下の3ステップとなります。
  1. 正規表現を表現するオブジェクトを生成する。
  2. 正規表現を対象文字列にかけてみる。
  3. かけた結果を取り出す。

それでは、具体的な実装を見て行きたいと思います!!



Objective-Cで正規表現を使う実装方法

今回は、以下のHTML文字列を処理対象としました。
<html>
<body>
  <h2>たいとる</h2>
  <img src='aaa.png' alt='image sample'/>
  <div>本文本文</div>
  <img src='logo.png' alt='logo'/>
</body>
</html>

上記文字列から、imgタグのsrc属性(つまり画像の保存先)を取得する正規表現を実装しました。
以下が実装無いようです。
// 処理対象のHTML文字列
NSString *html = /*上記のHTMLを代入*/

// 正規表現のオブジェクトを生成する。
// options:0は、正規表現のMatch範囲を出来るだけ狭くするように指定。
NSRegularExpression *regexp01
    = [[NSRegularExpression alloc] 
        initWithPattern:@"(<img.*?src=')(.*?)('.*?>)"
                options:0 
                  error:nil];

// 正規表現を対象HTMLにかけてみる。
// 正規表現にマッチした件数分、結果が取得できる。
NSArray *results 
    = [regexp01 matchesInString:html
                        options:0
                          range:NSMakeRange(0, summary.length)]];

// 結果から、src属性の内容を抜き出して、
// コンソールに出力してみる。
for( int i = 0; i < results.count; i++) {
  NSTextCheckingResult *result = [result objectAtIndex:i];
  // rangeAtIndeは、0に全体、1からはカッコ「()」の前からの順番で取得できます。
  // また文字列そのものではなく、html上の場所(NSRange)が取得できるようです。
 NSString *imgSrc = [html substringWithRange:[result rangeAtIndex:2]];
 console.log("imgSrc is %@", imgSrc);
}

上記の結果、以下2行が出力されます。
imgSrc is aaa.png
imgSrc is logo.png

これで正規表現が出来ました。
正規表現の部分((<img.*?src=')(.*?)('.*?>))は他の言語と同じですが、 正規表現のオブジェクトを生成したり、結果オブジェクトの扱いが面倒だったりと、 他の言語と比べて少し大変な部分も多いようです。

でもまぁ使い方になれれば、問題なさそうかなぁ(*゚▽゚)ノ



参考資料

今回は、以下のリファレンスを参照しました。
メソッドの意味、引数の意味、他のメソッドの詳細などは、以下を参照頂けると幸いです。
- NSRegularExpression Class Reference
- NSTextCheckngResult Class Reference



最後に

正規表現って難しいけど、使えると便利だし、使えた時はやったぜ!という気持ちになれて良い技術です(*´∇`*)
特にHTMLを扱う時とかは正規表現があると便利でありがたいと感じます。

今後も正規表現スキルをぼちぼちと上げたいなぁと思う今日この毎です。
最後までお読み頂きましてありがとうございました。






こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。