sql-server - SQL Server 字符串的正则表达式替换为 unicode 前缀

标签 sql-server regex string

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

正则表达式 (?:N'(?:''|[^'])*'[^']*)*(?<!N)'(?<value>(?:''|[^'])*)'没有正确匹配这个字符串:

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

它识别"N'someValue', 'someValue'"作为一场比赛

我想不出更正 RegEx 以匹配所有字符串文字,但不匹配带有 N 前缀的文字。

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

最佳答案

在我看来,有一个更适合您工作的工具 - 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)。当您尝试 parse HTML 时也是如此.它在现实生活中不会是 100% 的失败证明。

关于sql-server - SQL Server 字符串的正则表达式替换为 unicode 前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17875305/

相关文章:

regex - ElasticSearch可视化按字段 “message”中的某些关键字分组

Javascript 正则表达式匹配不在 HTML 标签定义内的最后一个空格

Java 问题 String.split()

Javascript 使用变量作为对象(数组)名称

sql - 如何引用第二个 SQL Server

sql-server - 如何在 SQL Server 中找到运行不佳的查询?

regex - sed 插入行命令 OSX

c++ - 为什么在C++中使用字符串时没有输出?

sql - 名字和姓氏表以提高性能?

c# - 如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程返回多个 SELECT 集