.NET Regex для строки SQL Server ... но не строка Unicode? - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь создать регулярное выражение .NET для соответствия константным строкам SQL Server ... но не строкам Unicode.

Вот немного SQL:

select * from SomeTable where SomeKey = 'abc''def' and AnotherField = n'another''value'

Обратите внимание, что внутри строки две одинарные кавычки экранируются одной кавычкой.

Регулярное выражение должно соответствовать 'abc''def', но не n'another''value '.

Теперь у меня есть регулярное выражение, которому удается найти строку, но оно также соответствует строке Unicode (начинающейся сразу после N):

'('{2})*([^']*)('{2})*([^']*)('{2})*'

Спасибо!

1 Ответ

1 голос
/ 18 августа 2011

Этот шаблон будет делать большую часть того, что вы хотите сделать:

(?<unicode>n)?'(?<value>(?:''|[^'])*)'

Достоинством является то, что оно должно точно соответствовать любому количеству экранированных кавычек. (SomeKey = 'abc''''def''' будет соответствовать abc''''def''.)

Недостатком является то, что он также совпадает со строками Unicode, хотя он захватывает ведущий n, чтобы идентифицировать его как строку Unicode. Когда вы обрабатываете регулярное выражение, вы можете игнорировать совпадения, где группа совпадений "Юникод" была успешной.

Шаблон создает следующие группы для каждого совпадения:

unicode: Success if the string is a Unicode string, fails to match if ASCII
value: the string value.  escaped single quotes remain escaped

Если вы используете регулярные выражения .NET, вы можете добавить (?(unicode)(?<-value>)) в конец шаблона для подавления совпадения со значением, хотя шаблон в целом все равно будет совпадать.

Редактировать

Подумав еще немного, следующий шаблон должен делать именно то, что вы хотели; это не будет соответствовать строкам Unicode вообще. Однако описанный выше подход может быть более читабельным.

(?:n'(?:''|[^'])*'[^']*)*(?<!n)'(?<value>(?:''|[^'])*)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...