SQL Server Management Studio / Visual Studio ошибка регулярного выражения? - PullRequest
2 голосов
/ 05 марта 2012

Я довольно часто использую поиск и замену регулярных выражений в редакторе SQL Server Management Studio 10.5 для очистки автоматически сгенерированного sql перед использованием.То же поведение, описанное ниже, происходит и в редакторе Visual Studio 2010.

У меня есть следующий SQL-оператор вставки, который я хотел бы очистить:

INSERT INTO [lttadev].[dbo].[GameInst]
           ([GameInstId]
           ,[GameSetId]
           ,[UserInfoId]
           ,[GameLevelId]
           ,[CreatedOn]
           ,[CreatedBy]
           ,[ModifiedOn]
           ,[ModifiedBy])
     VALUES
           (<GameInstId, uniqueidentifier,>
           ,<GameSetId, uniqueidentifier,>
           ,<UserInfoId, uniqueidentifier,>
           ,<GameLevelId, uniqueidentifier,>
           ,<CreatedOn, datetime,>
           ,<CreatedBy, uniqueidentifier,>
           ,<ModifiedOn, datetime,>
           ,<ModifiedBy, uniqueidentifier,>)

Чтобы изменить предложение values, у меня есть два следующих регулярных выражения:

,[^,]*,\>
\<

Оба заменяются пустой строкой для удаления нежелательного текста.Первая убирает запятую, тип, вторую запятую и конечную угловую скобку.Второй снимает начальную угловую скобку.Оба работают должным образом.

Однако, если я объединю регулярные выражения в одно выражение, чтобы ускорить обработку текста, они выделят другой текст:

(,[^,]*,\>|\<)

Первое выражение выбирает ожидаемый текст.Однако второе выражение получает как первую угловую скобку, так и предыдущую запятую.Это дефект в движке регулярных выражений или я чего-то не понимаю?

1 Ответ

1 голос
/ 06 марта 2012

Попробуйте заключить первую альтернативу в круглые скобки:

(,[^,]*,\>)|\<

В документации не указано, что имеет приоритет |, и приведен только этот пример:

(sponge|mud) bath

, но в другом месте на этой странице есть различные примеры, где | используется с круглыми скобками, которые были бы ненужными (хотя и безвредными) в другом движке регулярных выражений:

(("[^"]*")|('[^']*'))
(- [a-z][1-3])|(- [0-9][a-z])
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

, поэтому я предполагаю, что| может иметь довольно высокий приоритет - ниже, чем тривиальная конкатенация внутри строки sponge или mud, но выше, чем у более сложных конкатенаций, как в "[^"]*".(Конечно, это последнее выражение было написано кем-то, кто не заметил, что . имеет особое значение, поэтому он может потребовать немного соли.)

Поскольку у меня нет Visual Studio,Я не могу проверить это дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...