2011-08-17 67 views
0

我想構建一個.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})*' 

謝謝!

回答

1

這種模式將做你最期待的事:

(?<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

相關問題