最終更新: 2009-10-17T03:43+0900
var re = /\b/g; var match = re.exec( "012" ); alert( match.index ); //=> 0 alert( re.lastIndex ); //=> 0(ECMAScript仕様), 1(IE)
仕様では 何度 re.execを実行しても re.lastIndexが 0から増加しないから、re.execをループで実行するときにはマッチ結果が幅0のときに限り特別に lastIndexをインクリメントする処理が必要になる。
マッチの範囲は "0"の直前から "0"の直前までで、lastIndexは範囲の末尾の次の位置を指すもの。マッチの幅は0。
index = 0; lastIndex = 1; であればマッチ範囲は "0"(幅1)ということになってしまい正しくない。
index = 0; lastIndex = 0; であればマッチの幅が 0だということも、その位置が "0"の手前だということも表現できていて正しい気がする。
indexはマッチ結果のプロパティだけど、lastIndexはパターンオブジェクトのプロパティなのだ。match.index...re.lastIndexの範囲が正しいとか正しくないとかは考慮に値しないのではないか。
検索結果に影響があるかといえば、スクリプトエンジンが行ってくれないことを、スクリプトを書く人間が手作業で行っているだけなのだから影響はないだろう。
IEは至極まっとうな実装をしたと思う。
、u' '、U、U' ' というのがそれだ。早く使いたい。ところで、charより ucharの方がわかりやすくないか。char16…や char32…だとビット幅だけを規定してるみたいじゃない。……。実際にそうなんじゃないだろうか。Wikipedia(ja)には「char16_tとchar32_tであり、それぞれUTF-16とUTF-32を内部表現とする。」こうあるけど、エンコーディングを規定するのは u、U接頭辞だけ、とか。C++コンパイラにエンコーディングのバリデーションとかやってほしい人がいるとは思えないし、やらなければ内部表現云々はまるで無意味だし。……。UTF-16、UTF-32はエンコーディングではない気がしてきた(無知)。ならば Wikipedia(ja)の記述は、これらの符号化文字集合を単独で表現できる大きさ持った型だ、という意味だろうか。<< そろそろ調べどき。……。どちらも符号化方式だった。では C++0xの方を……。エンコーディングを持ってるのは文字列リテラルだけに思える。u8という接頭辞で UTF-8文字列を char配列に納められることもわかった。char16_tと char32_tについては「UTF-16とUTF-32を内部表現とする」というのは間違いで、「UTF-16、UTF-32の符号単位を格納するよう設計されている」が正しそう。「符号単位」という言葉を知らなかったのがうまく説明できなかった原因。「符号位置」(コードポイントの訳語だと思う)とは違う。