C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Regex.Replaceについて


(過去ログ 100 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■59874 / inTopicNo.1)  Regex.Replaceについて
  
□投稿者/ 雄山 (1回)-(2011/06/09(Thu) 16:14:55)

分類:[VB.NET/VB2005 以降] 

[VB2008使用]
こんにちは。雄山です。
以下のように正規表現を使って、文字列の最後に改行(CR+LF)をつけたいのですが、
もし文字列の最後に改行等を含む空白文字がある場合、これらを取り除いてから
改行を追加したいと思います。

str = System.Text.RegularExpressions.Regex.Replace(str, "\s*$", vbCrLf)

ただし、以下のように、文字列の最後が(CR+LF)で終わっている場合、これを実行すると
改行が多くついてしまいます。

Dim str As String = "あいうえおかきくけこ" & vbCrLf
str = System.Text.RegularExpressions.Regex.Replace(str, "\s*$", vbCrLf) '←strの中身が"あいうえおかきくけこ" & vbCrLf& vbCrLf になっている

ただし、Regex.Matchで上記文字列を調べてみると、パターン"\s*$"にマッチしているのは最後の改行の部分でした。

これは正規表現の置換結果として正しいのでしょうか。
それともRegex.Replaceの不具合なのでしょうか?

皆様のご見解をお聞かせください。
引用返信 編集キー/
■59880 / inTopicNo.2)  Re[1]: Regex.Replaceについて
□投稿者/ 魔界の仮面弁士 (2210回)-(2011/06/09(Thu) 16:40:00)
No59874 (雄山 さん) に返信
> Dim str As String = "あいうえおかきくけこ" & vbCrLf
このデータは、
 1行目 = 「あいうえおかきくけこ」
 2行目 = 「」
ですよね。

> str = System.Text.RegularExpressions.Regex.Replace(str, "\s*$", vbCrLf)
\s*$ は「{空白文字の0回以上の繰り返し}{行末}」なので、
 1行目 = 「あいうえおかきくけこ{CrLf}」
 2行目 = 「{CrLf}」
に置換されます。すなわち、
> '←strの中身が"あいうえおかきくけこ" & vbCrLf& vbCrLf になっている
ですね。


> Regex.Matchで上記文字列を調べてみると
Match ではなく、Matches を使いましょう。

For Each x As Match In Regex.Matches(str, "\s*$")

引用返信 編集キー/
■59881 / inTopicNo.3)  Re[1]: Regex.Replaceについて
□投稿者/ shu (773回)-(2011/06/09(Thu) 16:47:37)
No59874 (雄山 さん) に返信

"\s+(\n|$)"

引用返信 編集キー/
■59882 / inTopicNo.4)  Re[2]: Regex.Replaceについて
□投稿者/ 雄山 (2回)-(2011/06/09(Thu) 17:01:03)
アイヤー そういえば複数行として評価されてしまいますね。
謎がすべて解けました。
複数行対応のオプションで対応することで解決しました。
ありがとうございました。
解決済み
引用返信 編集キー/
■59884 / inTopicNo.5)  Re[2]: Regex.Replaceについて
□投稿者/ 魔界の仮面弁士 (2211回)-(2011/06/09(Thu) 17:17:22)
No59881 (shu さん) に返信
> "\s+(\n|$)"
> で

それだと、
 str = "あいうえおかきくけこ" & vbCrLf
 str = "あいうえおかきくけこ" & vbCrLf & vbCrLf
の時は良いけれど、
 str = "あいうえおかきくけこ"
の時に改行が付かなくなってしまうかも。

# 元データが長さゼロの文字列だった場合も改行を付けるのかな?

解決済み
引用返信 編集キー/
■59889 / inTopicNo.6)  Re[3]: Regex.Replaceについて
□投稿者/ shu (775回)-(2011/06/09(Thu) 17:28:27)
No59884 (魔界の仮面弁士 さん) に返信
> ■No59881 (shu さん) に返信
>>"\s+(\n|$)"
>>で
>
> それだと、
>  str = "あいうえおかきくけこ" & vbCrLf
>  str = "あいうえおかきくけこ" & vbCrLf & vbCrLf
> の時は良いけれど、
>  str = "あいうえおかきくけこ"
> の時に改行が付かなくなってしまうかも。

いじっているうちに'*'=>'+'にしてしまいました。
"\s*(\n|$)"
なら大丈夫だと思います。

解決済み
引用返信 編集キー/
■59891 / inTopicNo.7)  Re[4]: Regex.Replaceについて
□投稿者/ 魔界の仮面弁士 (2212回)-(2011/06/09(Thu) 19:46:01)
No59874 (雄山 さん) に返信
> 文字列の最後に改行(CR+LF)をつけたいのですが、
> もし文字列の最後に改行等を含む空白文字がある場合、
> これらを取り除いてから改行を追加したいと思います。
下記の認識であっていますか? >雄山さん

 (0) ""                   → "{CrLf}" もしくは ""
 (1) "ABC"                → "ABC{CrLf}"
 (2) "ABC{CrLf}"          → "ABC{CrLf}"
 (3) "ABC{CrLf}{CrLf}"    → "ABC{CrLf}"
 (4) "ABC{CrLf}XYZ"       → "ABC{CrLf}XYZ{vbCrLf}"
 (5) "ABC{CrLf}XYZ{CrLf}" → "ABC{CrLf}XYZ{vbCrLf}"
 (6) "ABC{CrLf}{CrLf}XYZ" → "ABC{CrLf}{CrLf}XYZ{vbCrLf}"



■No59889 (shu さん) に返信
>>>"\s+(\n|$)"
> "\s*(\n|$)"
> なら大丈夫だと思います。

それだと、"\s*$" の場合と同様に、
>>>>> Dim str As String = "あいうえおかきくけこ" & vbCrLf>>>>> '←strの中身が"あいうえおかきくけこ" & vbCrLf& vbCrLf になっている
になってしまう気がします。

解決済み
引用返信 編集キー/
■59898 / inTopicNo.8)  Re[5]: Regex.Replaceについて
□投稿者/ shu (776回)-(2011/06/09(Thu) 23:52:31)
2011/06/10(Fri) 22:46:29 編集(投稿者)
$と\n混在は厳しいですね。また\sが\r,\nを含んでいるので駄目ですね。
ということで、EndsWith(vbCrLf)でなかったらvbCrLfを追加しといてから処理するようにしてみました。

         Dim samples = {"",
                       "あいうえおかきくけこ" & vbCrLf,
                       "あいうえおかきくけこ " & vbCrLf,
                       "あいうえおかきくけこ",
                       "ABC",
                       "ABC ",
                       "ABC  ",
                       "ABC" & vbCrLf,
                       "ABC" & vbCrLf & vbCrLf,
                       "ABC" & vbCrLf & "XYZ",
                       "ABC  " & vbCrLf & "XYZ  ",
                       "ABC" & vbCrLf & vbCrLf & "XYZ",
                       "ABC  " & vbCrLf & "XYZ  " & vbCrLf & "CD EFG  HIJ  "
                      }

        For Each res In (From Src In samples Select Src, a = If(Src.EndsWith(vbCrLf), Src, Src & vbCrLf)
                         Select Src, Des = Regex.Replace(a, "[\s-[\r\n]]+\r\n", vbCrLf))
            Console.WriteLine(String.Format("{0} => {1}", res.Src.Replace(vbCrLf, "[CrLf]"), res.Des.Replace(vbCrLf, "[CrLf]")))
        Next

結果:
 => [CrLf]
あいうえおかきくけこ[CrLf] => あいうえおかきくけこ[CrLf]
あいうえおかきくけこ [CrLf] => あいうえおかきくけこ[CrLf]
あいうえおかきくけこ => あいうえおかきくけこ[CrLf]
ABC => ABC[CrLf]
ABC  => ABC[CrLf]
ABC   => ABC[CrLf]
ABC[CrLf] => ABC[CrLf]
ABC[CrLf][CrLf] => ABC[CrLf][CrLf]
ABC[CrLf]XYZ => ABC[CrLf]XYZ[CrLf]
ABC  [CrLf]XYZ   => ABC[CrLf]XYZ[CrLf]
ABC[CrLf][CrLf]XYZ => ABC[CrLf][CrLf]XYZ[CrLf]
ABC  [CrLf]XYZ  [CrLf]CD EFG  HIJ   => ABC[CrLf]XYZ[CrLf]CD EFG  HIJ[CrLf]

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -