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

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

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

Re[4]: 正規表現'MatchEvaluatorで他引数を渡したい


(過去ログ 163 を表示中)

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

■94392 / inTopicNo.1)  正規表現'MatchEvaluatorで他引数を渡したい
  
□投稿者/ TicTak (1回)-(2020/04/09(Thu) 11:05:33)

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

(VB2013使用)
正規表現を使用した置換で、以下のようにMatchEvaluatorを使う方法があります。

'例
Regex.Replace(txt, ptn, AddressOf ReplText)

'MatchEvaluator用メソッド
Private Function ReplText(ByVal m As Match) As String
    'マッチの結果に応じて置換文字列を返す
    Return ret   '←処理の結果
End Function


最初はこの概念が中々理解できなかったのですが、結構便利だし、
よく使うようになりました。

ただ、ここでまた壁にぶつかってしまいました。
MatchEvaluator用メソッドに渡したい変数が出てきました。
この変数の内容により処理を分岐させたいのです。
例えば以下のようなことをやりたいのです。

Private Function ReplText(ByVal m As Match, ByVal idx As Integer) As String
    If m.Index > idx Then
        '処理1
        Return ret1
    Else
        '処理2
        Return ret2
    End If
End Function

デリゲートという概念を十分に理解できていないことが問題だと思いますが、
MatchEvaluatorに別引数を渡す方法はあるのでしょうか?

引用返信 編集キー/
■94393 / inTopicNo.2)  Re[1]: 正規表現'MatchEvaluatorで他引数を渡したい
□投稿者/ Hongliang (987回)-(2020/04/09(Thu) 11:27:15)
デリゲートの概念というよりもうちょっと外側の方の話になりそうですが。

置換式が別関数化するほど複雑でないのなら、ラムダ式を使うことで解決できます。
ラムダ式内では、式外の変数を「キャプチャ」して使うことができます。

Dim idx As Integer = 1
' mの型はRegex.Replaceの定義から推論してくれるので省略
Regex.Replace(text, exp, Function (m)
    If idx < 0 Then
        Return "-" & m.Value
    Else
        Return "+" & m.Value
    End If
End Function)

置換式を関数化しておきたいのなら、クラス化する必要があるでしょう。
Class IndexReplacer
    Public Sub New(idx As Integer)
        _idx = idx
    End Sub
    Private _idx As Integer
    Public Function Match(m As Match) As String
        If _idx < 0 Then
            Return "-" & m.Value
        Else
            Return "+" & m.Value
        End If
    End Function
End Class

' 使う時はこんな感じ
Dim replaced As String = Regex.Replace(text, exp, AddressOf New IndexReplacer(4).Match)

引用返信 編集キー/
■94395 / inTopicNo.3)  Re[2]: 正規表現'MatchEvaluatorで他引数を渡したい
□投稿者/ TicTak (2回)-(2020/04/09(Thu) 11:43:30)
なるほど!MatchEvaluatorで使うメソッドをクラス化するという発想がありませんでした。
ちょっと複雑な処理が必要なので、こちらを選択することになると思いますが、
これなら必要な変数をこのクラスのコンストラクタに渡せばいいですね。
(このクラスのインスタンスがすでにあれば、プロパティで渡すことも狩野英孝ですね。)

目から鱗です。素晴らしい!
Hongliang 様、ありがとうございました!
解決済み
引用返信 編集キー/
■94396 / inTopicNo.4)  Re[3]: 正規表現'MatchEvaluatorで他引数を渡したい
□投稿者/ shu (1222回)-(2020/04/09(Thu) 12:39:07)
No94395 (TicTak さん) に返信


解決済のようですが、

Regex.Replace(txt, ptn, Function (m) ReplText(m, idx))

でも出来るかと思います。
解決済み
引用返信 編集キー/
■94397 / inTopicNo.5)  Re[4]: 正規表現'MatchEvaluatorで他引数を渡したい
□投稿者/ TicTak (3回)-(2020/04/09(Thu) 15:11:39)
なるほど。これは別クラスを用意しなくとも、自クラス内でReplText(m, idx)のメソッドを用意して、
ラムダ式でReplText(m, idx)を使うのですね。
これが一番シンプルですね!

ただ、今回は別クラスを用意した方が便利だったので、こちらを使いました。
(具体的には、MatchEvaluatorの結果に応じて、別クラス内に用意したプロパティ値を処理)

皆さん、ありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -