.NET正则表达式的SQL Server字符串...但不是Unicode字符串?

问题描述:

我想构建一个.NET正则表达式来匹配SQL Server常量字符串......但不是Unicode字符串。.NET正则表达式的SQL Server字符串...但不是Unicode字符串?

这里有点SQL的:

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

注意,在字符串中两个单引号逃逸单引号。

正则表达式应该匹配'abc''def'而不是n'another''值。

我有一个正则表达式,现在设法找到一个字符串,但它也匹配的Unicode字符串(只是N个后开始):

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

谢谢!

这种模式将做你最期待的事:

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

的好处是,它应该准确地匹配任何数量的转义引号的。 (SomeKey = 'abc''''def'''将匹配abc''''def''。)

的缺点是它也匹配的Unicode字符串,但它抓住了龙头n,表示它是一个Unicode字符串。处理正则表达式时,可以忽略匹配组“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>(?:''|[^'])*)' 
+0

我决定用你的( N') '((?:?'? '| [^'])*)”和MatchEvaluator处理代替我在做什么。请注意,你的第二个正则表达式匹配ansi字符串和unicode字符串。谢谢! – user505765