Поиск и замена с использованием регулярного выражения, группового захвата и обратных ссылок

Я пытаюсь выполнить операцию поиска и замены в SQL Server 2008 R2 Management Studio и использовать групповой захват, чтобы я мог обратно ссылаться на группы в замене. Как я понял из this, SSMS использует обработчик регулярных выражений Visual Studio 2005. Вот пример того, что у меня есть:

SELECT First FROM Table1
SELECT Second FROM Table2
SELECT Third FROM Table3

Вот мое выражение «Найти»:

SELECT (.+) FROM (.+)

Вот мое выражение «Заменить»:

\1 \2

Однако выполнение операции замены не приводит к возврату захваченных групп, т.е. каждая строка представляет собой просто "" (‹--- просто пробел между двумя обратными ссылками).

Что я делаю неправильно?


person rory.ap    schedule 08.07.2015    source источник
comment
Я могу быть здесь, но не следует ли вам заменить на $ 1, $ 2, поскольку \1 выполняет обратную ссылку на захваченную группу в регулярном выражении, но выражение замены для всех намерений и целей является новым?   -  person Andris Leduskrasts    schedule 08.07.2015
comment
Никакие 1 и 2 доллара не работают. Они возвращают себя как литералы, т.е. $ 1 $ 2.   -  person rory.ap    schedule 08.07.2015


Ответы (2)


Механизм SQL Server Management Studio использует выражения { и } для «тегирования»:

SELECT {.+} FROM {.+}

Когда вы объедините это с выражением замены \1 \2, вы получите ожидаемый результат:

First Table1
Second Table2
Third Table3

Подробности объясняются на справочной странице VS Regex. .

person Sergey Kalinichenko    schedule 08.07.2015
comment
Так что же это за аромат регулярного выражения? Есть ссылка на это? - person rory.ap; 08.07.2015
comment
@roryap Я не знаю, есть ли имя для этого конкретного вида регулярного выражения, но связанная мной страница документации говорит конкретно об этой разнице: существует много синтаксических различий между регулярными выражениями, которые можно использовать в Find what и Replace with и те, которые действительны в программировании .NET Framework. Например, в окне «Найти и заменить» фигурные скобки {} используются для обозначения заменяемых выражений. - person Sergey Kalinichenko; 08.07.2015
comment
Есть идеи, как сделать то же самое в SSMS 2016 (13.0.14000.36)? - person jumxozizi; 02.05.2016
comment
По какой-то странной причине в SSMS они используют $ 1 вместо \ 1 ... Не уверен, какой диалект Regex происходит от ... - person Wouter; 07.10.2016
comment
Я только что пробовал это в SSMS 2014, и $1 обрабатывается буквально, а \1 ничего не возвращает; Однако \0, похоже, возвращает все выражение целиком. Просто для справки, я использовал REGEX: R(M|D|T), совпадения были найдены, и M, D или T должны были быть возвращены для \1. - person Matt Arnold; 28.05.2019
comment
@Wouter - Это справедливо в предшествующем уровне техники, PHP, JavaScript, C # ... \1 и тому подобное используются внутри выражения для ссылки на захват (например, (["']).*?\1 для соответствия чему-то между " и " или ' и ', но не " и '), но в шаблоне замены это обычно $1 и тому подобное. - person T.J. Crowder; 26.06.2019

Для SSMS 17 и более поздних версий { ... } и \1 работать не будут. Вместо этого используйте ( ... ) и $1.

person Vadzim Dvorak    schedule 13.07.2018