替换为条件DTE

时间:2018-11-06 14:32:04

标签: regex vb.net if-statement envdte replacewith

我要匹配术语“ TextCtrls ”和“ LabelCtrls ”。 当我找到“ TextCtrls”时,我想替换为“ Txt ”,当我找到“ LabelControls”时,我想替换为“ Lbl ”。 Online Demo

DTE.Find.ReplaceWith是否可以?

DTE.Find.FindWhat = "Container\(""\w+""\)\.(?:TextCtrls|LabelCtrls)\(""(?<ControlName>\w+)""\).Text"

DTE.Find.ReplaceWith = "<psydocode:Txt|Lbl>${ControlName}.Text"

1 个答案:

答案 0 :(得分:3)

解决方案1:重用输入字符串中出现的文本

由于您要替换的文本实际上已出现在源文本中,因此您可以(ab)通过以下方式在此处使用捕获组:

DTE.Find.FindWhat = "Container\(""\w+""\)\.(?:(?<f>T)e(?<s>xt)Ctrls|(?<f>L)a(?<s>b)e(?<t>l)Ctrls)\(""(?<ControlName>\w+)""\).Text"
DTE.Find.ReplaceWith = "${f}${s}${t}NameOfControl.Text"

请参见.NET regex demo

fst组中填充了必要的文本位,并且只有在对应的替代项匹配时才具有文本。

enter image description here

解决方案2:将MatchEvaluator用于自定义替换逻辑

您可以使用MatchEvaluator检查匹配的组或组的值,然后实施自己的替换逻辑:

Dim s As String = "Container(""Name1"").TextCtrls(""Name2"").Text" & vbCrLf & "Container(""Name1"").LabelCtrls(""Name2"").Text"
Dim pattern As String = "Container\(""\w+""\)\.(?<test>TextCtrls|LabelCtrls)\(""(?<ControlName>\w+)""\).Text"
Dim result = Regex.Replace(s, pattern, New MatchEvaluator(Function(m As Match)
        If m.Groups("test").Value = "TextCtrls" Then
            Return "TxtNameOfControl.Text"
        Else
            Return "LblNameOfControl.Text"
        End If
    End Function))

输出:

enter image description here