Сначала включите Регулярные выражения в форме поиска и замены. В полном диалоге есть флажок для этого. Во всплывающем окне «Быстрый поиск» переключите третий значок под условиями поиска:
Если вы хотите сопоставить точно структуру элемента, которую вы указали, заполните следующие термины:
Поиск : <(TextBox) x:Name="([^"]*)\1"
Заменить : <Button x:Name="$2Button"
Тем не менее, вы можете сделать некоторые незначительные изменения для обработки случаев, когда x:Name
не является первым атрибутом или когда x:Name
появляется в отдельной строке. Это может быть очень удобно, если в ваших декларациях есть несоответствия.
Поиск : <(TextBox)(\s+[^>]*)x:Name="([^"]*)\1"
Заменить : <Button$2x:Name="$3Button"
Последний успешно преобразует следующее:
<TextBox Grid.Column="1" x:Name="Name1IDTextBox" />
<TextBox
x:Name="Name2IDTextBox" Grid.Column="1" />
<TextBox x:Name="Name3IDTextBox" Grid.Column="1" />
... в:
<Button Grid.Column="1" x:Name="Name1IDButton" />
<Button
x:Name="Name2IDButton" Grid.Column="1" />
<Button x:Name="Name3IDButton" Grid.Column="1" />
Классы персонажей
Вы спрашивали о наличии [^"]
и [^>]
в моих шаблонах поиска. Это классов символов . [abc]
говорит "соответствует символу a
, b
или c
" . [a-z]
означает "соответствует любому символу от a
до z
" . Если первый символ в скобках - ^
, то класс символов отрицается, например, [^abc]
означает ", соответствует любому символу , за исключением a
, b
или c
".
В моем случае я использовал [^>]*
, чтобы сожрать любые символы , за исключением >
, потому что я хотел захватить только атрибуты между <TextBox
и x:Name
. Я никогда не хочу запечатлеть за конец элемента. Если, например, не является атрибутом x:Name
, я бы не хотел совпадать с Grid.Column="1" OtherProperty="X" /> ... more elements ... <Label x:Name
.
Аналогично, я использую [^"]
, чтобы убедиться, что я не потребляю никаких символов за пределами конца строки.