Заменить условным DTE - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу соответствовать терминам " TextCtrls " и " LabelCtrls ". Когда я нахожу «TextCtrls», я хочу заменить на « Txt », а когда я нахожу «LabelControls», я хочу заменить на « Lbl ». Онлайн демо

Возможно ли это с DTE.Find.ReplaceWith?

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

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

1 Ответ

0 голосов
/ 06 ноября 2018

Решение 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

Группы f, s и t заполняются необходимыми битами текста и имеют текст, только если соответствующие альтернативы совпадают.

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

...