2009-02-06 4 views
3

Я хочу удалить квадратные скобки из строки SQL, но только там, где внутри них нет пробелов.Удалить скобки с регулярным выражением в C#

E.g. «SELECT [intId], [The Description]» должен возвращать «SELECT intId, [The Description]».

я могу получить квадратные скобки без пробелов внутри с регулярным выражением:

\[[^\s]*\] 

Как квадратные скобки из этих матчей будут удалены в исходной строке?

+0

Вы уверены, вы хотите это сделать? Как насчет скобок в строковых литералах? Или имена столбцов, которые соответствуют зарезервированным словам? –

+0

Абсолютно, я знаю, что здесь есть подводные камни. Я полагаю, что моя более широкая проблема заключалась в том, как вы можете заменить регулярные выражения на что-то из самого совпадения. Я понимаю, что теперь, с помощью этого примера. Эта замена будет выполняться только после того, как строка подвергнется некоторому разбору. – Paul

ответ

5
sql = Regex.Replace(sql, "\\[([^\\s]*)\\]", "$1"); 
+4

Вы можете улучшить читабельность этого выражения с помощью @ "\\ [(\ S +) \\]" – Juliet

+0

Это может иметь проблемы с вложенными скобками. Независимо от того, работает он или нет, зависит от правил синтаксиса, с которыми вы имеете дело. [foo [bar baz]] будет заменен foo [bar baz]. – nsayer

+0

Для 'SELECT [intId], [intId2], [The Description], [init [x]]' this возвращает 'SELECT intId], [intId2, [The Description], init [x]'. Если вы измените * (жадный) на *? (не жадным) результатом будет «SELECT intId, intId2, [The Description], init [x]». – mayu

3

Regex недостаточно, за исключением только одноразового использования на вашей конкретной строке. Если вы делаете это автоматизированным способом по многим SQL-строкам, вы можете попасть в кучу проблем с удалением скобок, которые вам нужны.

В этом случае вам нужно больше из SQL лексического анализатора/парсера, который может помочь вам сосредоточиться вниз на только именах столбцов и исключающие имена таблиц, строки, параметры в триггерах или функциях, и т.д. ...