Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

MS系で正規表現処理する時の不注意

Text Fileは行末という区切りが付きます。処理系に依存して CR , LF , CR+LF  の3種類が多いです。
1byteに統一していれば、混乱することは無いのですが、歴史的背景で、MS系のみ行末は CR+LFです。
C言語系はで \n は処理系に合わせて、CR か LFに読み替えてくれた気がします。CR+LFの2byteも1byteに読み替えてくれる処理系もあったように思います。(記憶違いかも知れませんが)
その際、MS系だとByte処理でカウントしていると元データと処理結果の累積値が異なってくるので煩雑になったりしました。
正規表現の文末の識別に "$"というコントロールCHARがあります。
これを行末として動作させるオプションに  RegexOptions.Multilineがあります。
素直に "lineEnd\s*$"  と 指定しても、行末を認識してくれません。行末の認識は lf(0x0A)で判断しているので、 lineEnd<行末> だと lineEnd(0x0D)(0x0A) となっていてパターンがマッチしません。
        moto = moto.Replace(vbCr, "") の一文を加えると、適切に処理してくれるのですが、不可避でしょうが不細工感が残ります。
文末や\nは改行という表現をするからには, 文末は 0x0A でなく0x0Dが該当しそうな気もします。これも不可避ですね。
  二バイトで改行というのは当時は意味があったようですが、今は足枷になってる感がします。長期に渡って使える規格ってできないものですね。
MS系の処理系なのに文末を 0x0A で処理するのはおかしいような気もします。他の処理系との互換性を重視したのであれば方言が強いし...よく解かりません。

投稿日時 : 2008年1月24日 11:44

Feedback

# re: MS系で正規表現処理する時の不注意 2008/01/24 13:47 裏口

Wikipediaの解説
http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89

---引用開始---
QDOS(マイクロソフトが買収し、MS-DOSと改名した)がCR+LFを採用したのは、CP/Mの実装を真似たためだと考えられている。更に、CP/MがCR+LFを採用した理由はいくつかの説が考えられている。 一つは、CP/MはUNIXをモデルとしていたため、UNIXの著作権を侵害したとしてAT&T/ベル研究所から訴えられる可能性を軽減しようとしたという説だ。もう一つは、CP/MはRT-11のようなDECオペレーティングシステムをモデルとしており、DECはもともとテレタイプ端末としての使用を想定して設計されていたという説だ。

その原因が何であれ、この慣習は後のMicrosoft Windowsに継承されている。
---引用終了---

理由が明確でない負の資産のような気がします。
# 現実逃避中じゃなくって、しばし休憩中。

# re: MS系で正規表現処理する時の不注意 2008/01/24 15:13 シャノン

遺産ではありますが負ではないと思います。
改行コードが2文字で表される理由は、Wikipedia によれば

> プリンタヘッドが右端から復帰するのに1文字の時間では間に合わなかった。これがCRが先に送られた理由である。

だそうです。
しかし、単に2文字分の時間を稼ぐだけであれば、CR+CRとかLF+LFとか、別になんであっても、改行という意味を持たせた2文字ならばよかった気がします。
それぞれにCRとLFという異なる意味を持たせた時点で、もはやプリンタヘッドが云々とは違う理由になったように思います。
CRとLFがあるのですから、改行時にはCR+LFであるべきで、CRだけとかLFだけの方が異端に見えます。

で、本題に戻って、Regex.MultiLine が LF だけしか行末と認識しないのはバグと言っていいような…。
ちなみに Unicode には7種類も改行コードがあるらしいです。

# re: MS系で正規表現処理する時の不注意 2008/01/24 16:47 なちゃ

プリンタの話ってキャリッジリターンとラインフィードが必要で
そのうちキャリッジリターンが先である理由って話じゃないですか?

ってまだ読んでないから間違ってるかもしれませんが。

# re: MS系で正規表現処理する時の不注意 2008/01/24 18:48 Ognac

># 現実逃避中じゃなくって、しばし休憩中。
充分お休み下さい

>理由が明確でない負の資産のような気がします。
>遺産ではありますが負ではないと思います。
負か否かは私ごときは判断できませんが...コントロール文字に2バイト使用するのは好くないかと。

>プリンタの話ってキャリッジリターンとラインフィードが必要で
CR , LF は別個のコントロール文字だったのに、結合して改行にしたあたりが軽はずみだった気がします。

>CRLF じゃなくて LFCR が正しいんじゃないの?ってお話もありますです。
元々、独立したコントロールだとしたら順序不問な気もします。

>で、本題に戻って、Regex.MultiLine が LF だけしか行末と認識しないのはバグと言っていいような…。
I think so.

>ちなみに Unicode には7種類も改行コードがあるらしいです。
どうやって使い分けするのだろう

タイトル
名前
Url
コメント