如何用正则表达式提取所有sql参数化语句的变量?

事理 2012-04-06 02:06:59
如where UserName=@User_$#@Name,提取出@User_$#@Name
参数化命名规则
只能包含字母、数字和_、$、#、@四个特殊字符,并且@不能在在开头同时存在,即@@User_$#@Name就不行(防止和select @@identity冲突)@User_$#@@Name也是可以的

网上找到的一种,但是没有考虑特殊字符的问题

List<string> result = new List<string>();
Regex paramReg = new Regex(@"[^@@](?<sqlParam>@\w+)");
MatchCollection matches = paramReg.Matches(sql);
foreach (Match m in matches)
Response.Write(m.Groups["sqlParam"].Value + ",");

正则表达式不是很清楚,希望大家帮忙下。
...全文
703 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
事理 2012-04-06
  • 打赏
  • 举报
回复
最终结果,希望对遇到同样问题的有些帮助

List<string> result = new List<string>();
Regex paramReg = new Regex(@"(?<!@)[^\w$#@]@(?!@)[\w$#@]+");
MatchCollection matches = paramReg.Matches(sql);
foreach (Match m in matches)
{
result.Add(m.Groups[0].Value.Substring(m.Groups[0].Value.IndexOf("@")));
}

q107770540 2012-04-06
  • 打赏
  • 举报
回复
(?<==)@(?!@)[a-zA-Z0-9_\$#@]+
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 17 楼 的回复:

string sql = "update StudentAttendance set UserId=@UserId,ClassId=@@C_@@l#$assId,AMClassTime=@AMClassTime,PMClassTime=@PMClassTime";

List<string> result = new List<string>();
Reg……
[/Quote]

嗯,可以了。
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 7 楼 的回复:

引用 5 楼 的回复:

@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"


Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");
这样提取出来只有,号了。
Regex paramReg ……
[/Quote]


string sql = "update StudentAttendance set UserId=@UserId,ClassId=@@C_@@l#$assId,AMClassTime=@AMClassTime,PMClassTime=@PMClassTime";

List<string> result = new List<string>();
Regex paramReg = new Regex(@"(?<!@)[^\w$#@]@(?!@)[\w$#@]+");//[^@@](?<sqlParam>@[A-Za-z0-9_$#@]+)
MatchCollection matches = paramReg.Matches(sql);
foreach (Match m in matches)
Response.Write(m.Groups[0].Value.TrimStart('=') + ",");
return;

这种可以成功提取,非常感谢大家,结贴。
EnForGrass 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

string sql = "update StudentAttendance set UserId=@UserId,ClassId=@@C_@@l#$assId,AMClassTime=@AMClassTime,PMClassTime=@PMClassTime";

List<string> result = new List<string>();
Rege……
[/Quote]
还不对啊?
事理 2012-04-06
  • 打赏
  • 举报
回复
string sql = "update StudentAttendance set UserId=@UserId,ClassId=@@C_@@l#$assId,AMClassTime=@AMClassTime,PMClassTime=@PMClassTime";

List<string> result = new List<string>();
Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");//[^@@](?<sqlParam>@[A-Za-z0-9_$#@]+)
MatchCollection matches = paramReg.Matches(sql);
foreach (Match m in matches)
Response.Write(m.Groups[0].Value + ",");

提取出的结果是
@UserId,@C_@@l#$assId,@AMClassTime,@PMClassTime

@@C_@@l#$assId还是不正确,如果遇到select @@identity就不行了。
事理 2012-04-06
  • 打赏
  • 举报
回复
嗯,可以了
事理 2012-04-06
  • 打赏
  • 举报
回复
string sql = "update StudentAttendance set UserId=@UserId,ClassId=@@C_@@l#$assId,AMClassTime=@AMClassTime,PMClassTime=@PMClassTime";

List<string> result = new List<string>();
Regex paramReg = new Regex(@"(?<!@)[^\w$#@]@(?!@)[\w$#@]+");//[^@@](?<sqlParam>@[A-Za-z0-9_$#@]+)
MatchCollection matches = paramReg.Matches(sql);
foreach (Match m in matches)
Response.Write(m.Groups[1].Value + ",");
return;
whowhen21 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:

试试
=\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$)


Regex paramReg = new Regex(@"=\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$)");
这样也只剩下,号了。
[/Quote]
这样调用:
Response.Write(m.Groups[1].Value + ",");
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

怎么可能只得到逗号呢,我给你的那个表达式根本匹配不到逗号。
[/Quote]

Regex paramReg = new Regex(@"[^@@](?<sqlParam>\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$))");
这样的只能取到最后一个@的变量
dalmeeme 2012-04-06
  • 打赏
  • 举报
回复
怎么可能只得到逗号呢,我给你的那个表达式根本匹配不到逗号。
EnForGrass 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 7 楼 的回复:

引用 5 楼 的回复:

@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"


Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");
这样提取出来只有,号了。
Regex paramReg = new Regex(@"[^@……
[/Quote]
修改一下
(?<!@)[^\w$#@]@(?!@)[\w$#@]+
EnForGrass 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:

@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"


Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");
这样提取出来只有,号了。
Regex paramReg = new Regex(@"[^@@](?<sqlParam>@(……
[/Quote]
试试这个(?<!@)[^\w$#@]+@(?!@)[\w$#@]+
dalmeeme 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"


Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");
这样提取出来只有,号了。
Regex paramReg = new Regex(@"[^@@](?<sqlParam>@(?<……
[/Quote]
源文本是什么?就你给出的那几个例子是可以的。
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

试试
=\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$)
[/Quote]

Regex paramReg = new Regex(@"=\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$)");
这样也只剩下,号了。
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"
[/Quote]

Regex paramReg = new Regex(@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+");
这样提取出来只有,号了。
Regex paramReg = new Regex(@"[^@@](?<sqlParam>@(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+)");
这样也不行,提取不正确。
whowhen21 2012-04-06
  • 打赏
  • 举报
回复
试试
=\s*@((?!@)[a-zA-Z0-9_$#@]+)(\s|$)
dalmeeme 2012-04-06
  • 打赏
  • 举报
回复
@"(?<=[^0-9a-zA-Z])@(?!@)[0-9a-zA-Z_$#@]+"
事理 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

试试[^@@](@[\w\$#\@]+)
[/Quote]

试了,也会把@@User_$#@Name提取出来。
EnForGrass 2012-04-06
  • 打赏
  • 举报
回复
试试[^@@](@[\w\$#\@]+)
加载更多回复(2)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧