3

我有一个类似的问题: .NET Regex for SQL Server string... but not Unicode string?

RegEx(?:N'(?:''|[^'])*'[^']*)*(?<!N)'(?<value>(?:''|[^'])*)'与此字符串不正确匹配:

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

它识别"N'someValue', 'someValue'"为匹配

我无法纠正正则表达式以匹配所有字符串文字,但不匹配带有 N 前缀的文字。

就像上面的链接中提到的那样,正则表达式必须忽略字符串空间中的转义引号,例如'some '' escaped'

4

1 回答 1

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 语法(正则表达式)来解析 Type-0 语法 (T-SQL)。当您尝试解析 HTML时也是如此。在现实生活中,它不会是 100% 的失败证明。

于 2013-07-26T08:27:15.330 回答