• ベストアンサー

VB.NET2003での正規表現

VB.NET2003で開発しています。 フォルダ下にあるすべてのテキストファイルを読み込み 変換してフォルダコピーをするのですが、 置き換え条件ですが 「行頭(できればテキストファイルの先頭のみ)の■以外の■は直前で改行する」 例: 元テキスト ■こあら■たわし■まりも → ■こあら ■たわし ■まりも にしたいのです。 普通に strtext = strtext.Replace("■", vbCrLf & "■") とすると最初の■も改行してしまうのでそれを避けたいです。 アドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

> (A)(B)でAかつB、 > (?<=.)で任意の文字が0か1文字 >(?=■)で文字が■ > >合わせて、任意の■が0か1文字の時っていう意味がありそうですけど?? (?<= ) は戻り読みと呼ばれるもので、注目している場所から 後戻りにしてそのカッコの中のものがあるかどうかを 確認し、存在していればマッチ成功で なければ失敗します。 (?<=.) は、今自分が注目している場所の一つ前に 何らかの文字が存在しているかどうかを確認しています。 これにより、行頭にいきなり■が登場した場合を弾きます。 次に(?=■)ですが、これは先読みといって戻り読みとは逆に 今注目している場所の先にカッコの中のものが存在しているかどうかを 確認します。 つまり、(?<=.)(?=■) を vbCrLfに置換するということは、 ひとつ前に文字が必ずあり、次の文字が■である場所に ■を挿入するという操作になります。 先読みや戻り読みを使わない場合、実際に文字を捕獲しておいて、 それを置換でも使う($1や$2など)ということを しなければなりませんが、このやり方だと そうした捕獲(と記憶)は不要になります。

tocci_pc
質問者

お礼

まことにありがとうございます。 懇切丁寧に教えていただきありがとうございました。 もう少し、正規表現については独学してみます。 ありがとうございました。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

今確認できる環境にないのですが、 (?<=.)(?=■) を vbCrLf で置換か (.)(?=■) を $1 & vbCrLf で置換か (.)(■) を $1 & vbCrLf & $2 で置換 のどれかでいけると思います。 ひょっとしたら後方参照が $1($2)じゃなくて、\1(\2)かもしれませんが そのときは書き直してください。

tocci_pc
質問者

お礼

>(?<=.)(?=■) を vbCrLf で置換か で出来ました(他は検証していません) VBのソースは strtext = System.Text.RegularExpressions.Regex.Replace(strtext, "(?<=.)(?=■)", vbCrLf) (A)(B)でAかつB、 (?<=.)で任意の文字が0か1文字 (?=■)で文字が■ 合わせて、任意の■が0か1文字の時 っていう意味がありそうですけど?? しばらく締め切らないので、 もしよろしければ、今後ほかの人が見ていただけるように 理論を教えていただくと幸いです。

  • NYOI
  • ベストアンサー率58% (56/96)
回答No.2

一文字目が"■"で確定しているのなら strtext = "■こあら■たわし■まりも" であるとき strtext = "■" & strtext.Substring(1).Replace("■", vbCrLf & "■")

tocci_pc
質問者

お礼

正規表現を使わないのであれば、いけますね。 特に、正規表現を使わないといけないルールは無いので No.1さんの回答ができなかった場合、こちらを使わせていただきます。 ありがとうございます。

回答No.1

Imports System.Text.RegularExpressions Class himajin100000 Shared Sub Main() System.Console.WriteLine(Regex.Replace("■こあら■たわし■まりも", "(?!^■)■", System.Environment.NewLine & "■")) End Sub End Class '自信ないけど,これだとどう? 'あ、単に処理するだけなんで,置換結果見たいときは 'フォームに表示してみるとか 'End Subの行でブレークポイントしかけてみないと見られないかも

tocci_pc
質問者

お礼

駄目でしたね。 他で調べたところ"(?!^■)■"の表現も見つけたのですが、 変換されませんでした。

関連するQ&A