正規表現:行頭に続く*5文字までを同数のスペースに置き換えたい

vb.netで正規表現を使用しています。行頭にアスタリスクが0~5文字までついているものを同数のスペースに置き換えたいのです。

例:「***123」→「 123」「**12」→「 12」

正規表現で表記する方法、もしくは表記できないのであればそう教えてください。

普通に文字列としてループさせながら処理するとか、5文字まででいったん切断して処理するとかはできますので、回答は結構です。

回答の条件
  • 1人2回まで
  • 登録:2008/01/14 11:25:42
  • 終了:2008/01/14 16:32:21

ベストアンサー

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252008/01/14 15:57:10

ポイント100pt

単純な文字列置換の正規表現では、繰り返し回数指定があるパターンに対してその繰り返し数と同じ数の置換を行う、ということは表現できません。

ですが、単純な文字列置換ではなくマッチした文字列を MatchEvaluator デリゲートに渡すようにすればそのような置換も可能です。

Imports System.Text.RegularExpressions

Namespace MyNameSpace
   Module Module1

      Public Sub Main()
         Dim myEvaluator As MatchEvaluator = New MatchEvaluator(AddressOf ReplaceToWS)
         Console.WriteLine(Regex.Replace("******A", "^\*{0,5}", myEvaluator))
      End Sub

      Public Function ReplaceToWS(ByVal m As Match) As String
         Return m.ToString.Replace("*", " ")
      End Function

   End Module
End Namespace

上記サンプルでは "(スペース5個)*A" という文字が出力されます。

仕組みとしては、"^\*{0,5}"(先頭から5文字以下のアスタリスク)にマッチしたら、その部分に対してReplaceToWS関数を実行するという風になります。

id:memo77

なるほど!

美しいし応用がききますね。

非常に勉強になりました。ありがとうございます。

2008/01/14 16:31:30
  • id:Mook
    質問の意図を勘違いしていましたので、開封不要です。
  • id:memo77
    はい。わざわざすみません。
  • id:Mook
    VBS での実装例ですのでコメントで失礼します(ほぼ同様だと思いますが)。

    冗長でエレガントではないですが、こんな感じでも一応はできそうです。

    ~~~~~~~~~~~~~~~~~~~~~
    Option Explicit

    Dim regEx
    Dim ins, ll, ret, mc

    Set regEx = New RegExp
    regEx.Pattern = "^\*{1,5}"
    regEx.Global = True

    ins = "*123" & vbNewLine & "**345" & vbNewLine & "****5**6**7" & vbNewLine & "*******890"
    For Each ll In Split( ins, vbNewLine )
      For Each mc In regEx.Execute( ll )
        ret = ret & regEx.Replace( ll , Left( "// ここにスペース5個//", Len( mc ) ) ) & vbNewLine
      Next
    Next
    WScript.Echo ret
    ~~~~~~~~~~~~~~~~~~~~~
  • id:memo77
    ありがとうございます。質問も言葉足らずでした。
    Regex.Replace("***ABC",Hoge,Moge)
    で1ステップで書きたかったんですよね。
    やはりMacthオブジェクト使わないと無理かな。

    どんな方かなと見に行って、いるか率の高さにびっくりしました。
    私も1/10を維持したいと思ってますが、見習いたいところです。

    他の方の回答がつかなければ、オープンしてポイントをお送りいたします。
  • id:Mook
    駄回答でしたが、わざわざポイントありがとうございました。


    y-kawaz さんの回答は私も参考になりました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません