SQL лимит захвата группы поиска и замены регулярного выражения? - PullRequest
6 голосов
/ 29 марта 2012

Мне нужно преобразовать данные из электронной таблицы в операторы вставки в SQL.Я разработал большинство регулярных выражений для использования инструмента поиска и замены в SSMS, но у меня возникла проблема при попытке сослаться на 9-й элемент в скобках в моей последней замене.

Вотисходная запись:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012

И это то, что мне нужно (на данный момент):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101'

Из-за ограничений на количество разрешенных в скобках элементов, я должен пройти через три заменыраз.Это может работать в хранимой процедуре, если я смогу сначала заставить эту работу работать как POC.

Это первое соответствующее выражение:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z}

И замена: \10\2/0\3/\40\5/0\6/\7

Это добавляет нули к месяцам и дням, чтобы они имели как минимум два символа.

При следующем совпадении даты переформатируются в формат, требуемый в запросе (без комментариев о том, что поле даты не используется.Это требование клиента для базы данных).

Соответствующее выражение:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}

И замена: \1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

Наконец, при окончательном совпадении результаты вставляются воператор SQL, который будет использоваться в операторе вставки.

Соответствующее выражение:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z}

И замена: select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

Все это работает, кроме последней замены,По какой-то причине \ 9 НЕ получает данные из матча.Если я просто заменю все выражение замены на \ 9, я получу пробел.Если я использую \ 8, я получу N. Если я исключу 8-й элемент, заключенный в скобки, и, таким образом, мой 9-й элемент станет восьмым, он вернет то, что я хочу, 20120101.

Итак, мой вопрос: допускает ли SSMS / SQL9 теговых выражений при использовании поиска / замены и регулярных выражений?Или я что-то здесь упускаю?Я знаю, что есть и другие способы сделать это.Я просто пытаюсь сделать это быстро как POC прежде, чем мы переместим это в sproc или приложение.

Спасибо за любую помощь.-Питер

1 Ответ

2 голосов
/ 29 марта 2012

Ни одно из ваших подходящих выражений не работает с записью, предоставленной вами в моей MS SQL Server Management Studio 2008r2.

Из вашего описания звучит так, как будто есть проблема с Tagged Expression 9, поскольку желаемый результат возвращается при использовании Tagged Expression 8, но не 9. Вы можете спросить Microsoft или сообщить об этом как об ошибке .

Более быстрым решением было бы переместить текст, над которым вы выполняете поиск / замену в SSMS, на электронную таблицу и использовать формулы ячеек для анализа данных в командах вставки. Если у вас MS Excel, вам, вероятно, пригодятся функции CONCATENATE, FIND и MID. Кроме того, это помогает разбить значения на их собственные столбцы, чтобы вы могли отформатировать дату, а затем использовать одну конкатенацию для построения вставки.

Пожалуйста, дайте мне знать, если вам нужен пример.

Обновление: Я попробовал ваш пример в MS SQL Server Management Studio 2008r2, Visual Studio 2005 и Visual Studio 2010 с тем же результатом, который вы получаете, \ 9 возвращает пустую строку. Проверяя, я обнаружил, что другие также имеют эту проблему (см. Контент сообщества от Энрике Эваристо) и что вся система была заменена в новых редакторах .

Поэтому, отвечая на ваш вопрос, SSMS не поддерживает 9 выражений с тегами из-за ошибки.

Если вы не можете использовать идею электронной таблицы, вы можете попытаться разделить действие на две части, задав первые 8 значений, а затем вернувшись назад, чтобы выполнить последнее. Например:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z
select '\1','\2','\3','\4','\5','\6','\7','\8','\0'

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z}
\1
...