正则表达式分组

LarryHSong 2009-03-12 03:27:25
将一段语句分组,提取出匹配的项,例如alsj <%=dd%> kkj <%= dd.GetName(" He!you#<br>"+MSG )%>,怎么把里面的<%=dd%>,<%= dd.GetName(" He!you#<br>"+MSG )%>分别找出来。
我试过<%[ ]*=[ ]*.*[ ]*%>会把两个一起找出来,成<%=dd%> kkj <%= dd.GetName(" He!you#<br>"+MSG )%>,
测试语句<%=%>中间是大多数常见的字符,包括!{+等等,所以我也试过一个个的把这些特殊字符加进去,如<%[ ]*=[ ]*[\!|"-\=|A-Z|a-z| |\.|\(|\)|]*[ ]*%>,也还是不成功,请问这个正则表达式该怎么写?
...全文
158 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
止戈而立 2009-03-12
  • 打赏
  • 举报
回复
不建议用[ ]*


Regex reg = new Regex(@"<%\s*=[\s\S]*?%>");
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
Good,
Regex reg = new Regex(@"<%[ ]*=[\s\S]*?%>");
简洁,明了。谢谢,结贴啦!
止戈而立 2009-03-12
  • 打赏
  • 举报
回复
你理解错了。是"中间可以有<>",双引号外面就不可以。
调试过是可以有结果的。
你试下改成:
Regex reg = new Regex(@"<%=[\s\S]*?%>");
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
还有个问题像这样的 <%=A.GetName(" <script>alert(10) </script>")%>,是允许里面有 <,>的,从你的表达式来看就不会找到这个项的
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
大哥,我是调试的,结果result=<%=dd%>\r\n,环境是vs2005
Regex reg = new Regex(@"<%=([^>]*|" + "[^\"\">]*\"[^\"\"]*\"\"[^>]*)%>");
string result = string.Empty;
string temp = "alsj <%=dd%> kkj <%= dd.GetName(\" He!you# <br>\"+MSG )%> lb.Text= \"\"+Helo; lbt.Text= ToMSG";
foreach (Match m in reg.Matches(temp))
{
result += m.Value + "\r\n";
}
止戈而立 2009-03-12
  • 打赏
  • 举报
回复
发你自己的代码出来。你该不会显示到文本框里,然后文本框是单行的吧?
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
To min_jie and netwar,谢谢两位,
不过,问题依然,还是只能查出第一个<%=dd%>,
ps:刚刚地震了一下,有点吓人!
netwar 2009-03-12
  • 打赏
  • 举报
回复
<%=[^%>].*?%>
测试通过。
netwar 2009-03-12
  • 打赏
  • 举报
回复
<%[^%>].*?%>

止戈而立 2009-03-12
  • 打赏
  • 举报
回复
我晕。。跑出一个<%=A。。。出来了。。
改一下:

            Regex reg = new Regex(@"<%=([^>]*|" + "[^\"\">]*\"[^\"\"]*\"\"[^>]*)%>");
string result = string.Empty;
string temp = "alsj <%=dd%> kkj <%= dd.GetName(\" He!you# <br>\"+MSG )%> lb.Text= \"\"+Helo; lbt.Text= ToMSG";
foreach (Match m in reg.Matches(temp))
{
result += m.Value + "\r\n";
}
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
谢谢!
不过还是不对,用的你代码
            Regex reg = new Regex(@"<%=\s*dd([^>]*|" + "[^\"\">]*\"[^\"\"]*\"\"[^>]*)%>");
string result = string.Empty;
string temp = "alsj <%=dd%> kkj <%= dd.GetName(\" He!you# <br>\"+MSG )%> lb.Text= \"\"+Helo; lbt.Text= ToMSG";
foreach (Match m in reg.Matches(temp))
{
result += m.Value + "\r\n";
}
修改了下进行的测试,还是只能找到第一个<%=dd%>,还有这种情况<%=A.GetName("<script>alert(10)</script>")%>,是允许里面有<,>的。所以你的表达式还是有问题的。麻烦再看看哈!
止戈而立 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 LarryHSong 的回复:]
No,试了,只能找到第一个,你试成功了吗?
[/Quote]

当然。可能是你的代码有问题。。
Regex reg=new Regex(@"<%=\s*dd([^>]*|[^"">]*\"[^""]*""[^>]*)%>");
string result=string.Empty;
foreach(Match m in reg.Matches("你的字符串"))
{
result+=m.Value+"\r\n";
}
LarryHSong 2009-03-12
  • 打赏
  • 举报
回复
No,试了,只能找到第一个,你试成功了吗?
止戈而立 2009-03-12
  • 打赏
  • 举报
回复
TRY:

Regex reg=new Regex(@"<%=\s*dd([^>]*|[^"">]*\"[^""]*""[^>]*)%>");

111,126

社区成员

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

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

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