« Delphiで正規表現(VBScript) | トップページ | Delphiで正規表現(Onigumo) »

2013年11月 9日 (土)

Delphiで正規表現(NSRegularExpression)

前回のDelphiで正規表現(VBScript) で書いたように、CocoaのNSRegularExpressionを使ってラップしたSystem.RegularExpressions.NSRegularExpressesion.pasを完成させましたdashdashdash

ということで、RegExPackの方を更新しておきました。詳しくはreadme.txtを。


Delphi XE4以降が必要です。

ところで、Cocoa APIを使って初めて本格的にプログラミングしたのですが、Cocoaで文字列を扱う場合は、NSStringクラスを使うことは知っていて、NSRegularExpressionクラスでもパターン、検索対象の文字列をNSStringクラスとしてやりとりするのですが、最後まで壮大な勘違いをしてましたdashdash

NSStringクラスというはUTF-16が基本sign02なんですね・・・・ずっと、UTF-8だと思ってましたsweat02sweat02。だから、NSStringのlengthプロパティはバイト(UTF-8のコードユニット)数ではなく、ワード(UTF-16のコードユニット)数を返す・・dashdashdash。ということで、Delphiのstring型と相性いいじゃんupupSystem.RegularExpressions.NSRegularExpressesion.pasの実装で、気付くまで、UTF16->UTF8へ変換したり、インデックスを調整するコードをごりごり書いていた・・・・

ということで、Delphi標準のMacapi.Foundation.pasに、Delphiのstring型をNSStringに変換するNSSTR関数がありますが、

思いっきりUTF-16<->UTF-8の変換のオーバーヘッドが発生してるようーーなsweat02sweat02。NSTR関数は使わないで、やるなら、NSStringクラスのstringWithCharacters:length:クラスメソッドと、getCharacters:range:インスタンスメソッドを使って、

ちなみに、stringWithCharacters:length:だと、指定した文字列がコピーされてメモリ上に重複してに持つことになるので、initWithCharactersNoCopy:length:freeWhenDone:インスタンスメソッドを使えば、Delphi側とメモリを共有できるっぽいup

このまま、調子に乗って、モチベーションが続く限り、次はUTF-16のPCRE版か、Oniguruma(Onigumo)版かな????

元々は、RFC 6265のクッキー仕様を実装しようとしてて、そこで正規表現使おうかなと思って、今は、クッキー仕様の実装ほったらかしで脱線しすぎ・・

« Delphiで正規表現(VBScript) | トップページ | Delphiで正規表現(Onigumo) »

Delphi」カテゴリの記事

iOS」カテゴリの記事

MacOS X」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/53823748

この記事へのトラックバック一覧です: Delphiで正規表現(NSRegularExpression):

« Delphiで正規表現(VBScript) | トップページ | Delphiで正規表現(Onigumo) »

自作ソフトウェア

無料ブログはココログ

メモ