2013-07-26 36 views
3

我有一個類似的問題是這樣的:正則表達式的SQL Server字符串使用Unicode前綴來代替

Insert into SomeTable (someColumns) values ('someValue', N'someValue', 'someValue')

它承認"N'someValue', 'someValue'".NET Regex for SQL Server string... but not Unicode string?

正則表達式(?:N'(?:''|[^'])*'[^']*)*(?<!N)'(?<value>(?:''|[^'])*)'此字符串正確不匹配作爲比賽

我不能找出正確的RegEx匹配所有字符串文字,但不是與N-Pref文字九。

就像在正則表達式上面的鏈接提到必須忽略字符串的空間轉義引號像'some '' escaped'

+0

有些東西告訴我最好在沒有REGEX的情況下解決這個問題。 – GolfWolf

回答

1

在我看來,對於你的工作更好的工具 - TSql100Parser類:

using Microsoft.Data.Schema.ScriptDom; 
using Microsoft.Data.Schema.ScriptDom.Sql; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IList<ParseError> errors = new List<ParseError>(); 
     var tsql = @" 
       Insert into SomeTable (someColumns) 
       values ('someValue1', 
         N'someValue2', 
         'someValue3', 
         'some '' escaped')"; 
     var result = GetLiterals(tsql); 
    } 

    private static List<string> 
     GetLiterals(string strQuery) 
    { 
     var parser = new TSql100Parser(false); 
     IList<ParseError> errors = new List<ParseError>(); 
     var result = 
      parser.GetTokenStream(new StringReader(strQuery), errors); 
     return result 
      .Where(t => 
       t.TokenType == TSqlTokenType.AsciiStringLiteral || 
       t.TokenType == TSqlTokenType.UnicodeStringLiteral) 
      .Select(t => t.Text) 
      .ToList(); 
    } 
} 

您不能使用Type-3語法(正則表達式)來分析類型0語法(T-SQL)。當您嘗試parse HTML時也是如此。它在現實生活中不會100%失敗。

+1

謝謝你的回答,不幸的是我必須在delphi中實現它:( 我設法實現它與一個不太複雜的正則表達式來找到字符串文字和一些手動解析 – deterministicFail

+1

也許你已經讀過它,但如果不,這個問題的答案可能會有所幫助:[需要在Delphi的SQL解析器](http://stackoverflow.com/questions/615608/need-in-sql-parser-on-delphi)。 –