Этот шаблон будет делать большую часть того, что вы хотите сделать:
(?<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>(?:''|[^'])*)'