c# - 在 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();
解决方案
您可以使用
\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
推荐阅读
- file - Perl 用户输入文件搜索
- javascript - Discord bot 不播放有年龄限制的视频
- c++ - 段错误在gtest中的堆栈上初始化引用变量
- r - 在 R 中使用 ifelse 语句创建新变量
- r - 使用 data.table 解决方案根据 id 将观察结果分组到指定数量的组中
- javascript - 动画 Javascript OnMouseOver
- python - 使用 for 循环遍历文本文件中的单个单词
- godot - 如何更改脚本中的精灵?
- windows - PWA for Windows 的功能是什么?
- php - 使用 php 我需要有 2 个不同的数据库连接