首页 > 解决方案 > 在 SQL 查询中使用正则表达式获取所有未设置的参数

问题描述

INSERT INTO TestTable
(
    Test1,
    Test2,
    Test3,
    Test4,
    Test5
)
VALUES
(
    @Test1,
    @Test2,
    @Test3,
    @Test4,
    @Test5
)

SET @Id = SCOPE_IDENTITY()

我试图在我的查询中获取所有未设置的变量,这是我的正则表达式,它也获得了@Id,我的目标是不包括已在查询中设置的所有变量

这是我的正则表达式

Regex.Matches(sql, @"\@\w+").Cast<Match>().Select(m => m.Value).ToList();

标签: c#regex

解决方案


您可以使用

\B@\w+\b(?!\s*=)

请参阅正则表达式演示详情

  • \B@- 匹配@前面没有字符 char(以避免匹配子字符串,如abc@def.com等)
  • \w+- 一个或多个单词字符
  • \b- 字边界(需要在后续的否定前瞻匹配失败时防止回溯,以便如果整体@word可能失败而不返回@wor匹配)
  • (?!\s*=)-如果在当前位置的右侧有零个或多个空格,然后是一个字符,则匹配失败的负前瞻=

请注意,这@不是特殊的正则表达式元字符,您不需要在正则表达式中对其进行转义。

请参阅C# 演示

var text = "INSERT INTO TestTable\r\n(\r\n    Test1,\r\n    Test2,\r\n    Test3,\r\n    Test4,\r\n    Test5\r\n)\r\nVALUES\r\n(\r\n    @Test1,\r\n    @Test2,\r\n\r\n    @Test3,\r\n    @Test4,\r\n\r\n    @Test5\r\n)\r\n\r\nSET @Id = SCOPE_IDENTITY()";
var result = Regex.Matches(text, @"\B@\w+\b(?!\s*=)")
        .Cast<Match>()
        .Select(x => x.Value);
foreach (var s in result)
    Console.WriteLine(s);

输出:

@Test1
@Test2
@Test3
@Test4
@Test5

推荐阅读