正規表現で詰まりました。

タグの編集
投稿者 T  (社会人) 投稿日時 2010/8/10 11:11:45
例えば、
When I was a child, I went there.
を、
W●●● I ●● a c●●●●, I w●●● t●●●●.
と語頭以外のアルファベットと数字を●に置換したいのです。

正規表現を使えばできそうな気がしたので、
RegularExpressios.Regex.Replaceでやってみました。

自分で考えてみたのは以下です。
置換前を(¥w)¥w+
置換後を&1*

これでうまくいかないのはわかるのですが、どうすればうまくいくのかわかりません。

どうかご教授ください。
投稿者 (削除されました)  () 投稿日時 2010/8/10 12:12:46
(削除されました)
投稿者 よねKEN  (社会人) 投稿日時 2010/8/10 12:15:34
他にもいい方法があるかもしれませんが、
Regex.Replaceの以下のURLのオーバーロードを用いて実現できます。
http://msdn.microsoft.com/ja-jp/library/ht1sxswy.aspx

' コード例
Imports System
Imports System.Text.RegularExpressions

Module Program
    Sub Main
        Dim text As String = "When I was a child, I went there."
        Dim pattern As String = "\w+"
        Console.WriteLine(Regex.Replace(text, pattern, AddressOf MyMatchEvaluator))
        
        Console.Read()
    End Sub

    Public Function MyMatchEvaluator(ByVal  match As Match) As String
        Return match.Value.Substring(0, 1) & new String("●"c, match.Length-1)
    End Function
End Module
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/8/10 12:15:41
これでどうでしょう
Dim result As String = Regex.Replace(source, "\w+"Function(m) m.Value(0) & StrDup(m.Length - 1, "●"c))
投稿者 よねKEN  (社会人) 投稿日時 2010/8/10 12:59:05
以下のような方法もあります。

Dim text As String = "When I was a child, I went there."
Dim pattern As String = "(?:\w)\w*"
Console.WriteLine(Regex.Replace(text, pattern, "●"))

この書き方については以下をご覧ください。

グループ化構成体 - 非キャプチャ グループ
http://msdn.microsoft.com/ja-jp/library/bs2twtah.aspx#noncapturing_group
投稿者 T  (社会人) 投稿日時 2010/8/10 21:02:00
よねKENさん、魔界の仮面弁士さん、どうもありがとうございます!

よねKENさんのやり方の、AddressOf MyMatchEvaluatorとか、
魔界の仮面弁士さんの、Function(m) の部分とか、
理解できてませんが、とりあえず、うまくいきました。

ちなみに、よねKENさんの二つめの方法は試してみましたが、うまくいきませんでした。
●●●●,●●●●●●.
みたいな感じになりました。
投稿者 よねKEN  (社会人) 投稿日時 2010/8/10 23:07:02
> ちなみに、よねKENさんの二つめの方法は試してみましたが、うまくいきませんでした。
> ●●●●,●●●●●●.
> みたいな感じになりました。 

申し訳ありません。きちんと結果を確認してから投稿したつもりでしたが、
今試したらご指摘の通りうまく行きませんでした。結果の確認のときに何か勘違いをしたようです。
で、修正版を考えました。

Dim text As String = "When I was a child, I went there."
Dim pattern As String = "(?<=\w)\w"
Console.WriteLine(Regex.Replace(text, pattern, "●"))

でうまく行きます。VB2008で確認しました。
「(?<=」という書き方の部分が肝ですが、この件についての資料は以下にあります。

ゼロ幅の正の後読みアサーション
http://msdn.microsoft.com/ja-jp/library/bs2twtah.aspx#zerowidth_positive_lookbehind_assertion

ただ正直、上記のURLの説明は難解なので、以下のURL(のページの真ん中付近)
の説明の方がわかりやすいと思います。
http://dobon.net/vb/dotnet/string/regex.html