抢分咯!简单正则表达式问题(已有部分代码)!
我要从aspx文件中提取所有的服务器控件(包括控件的ID、类型、Name属性(存在的情况下),如果是input类型的控件,还要提取type属性的值)
现在已经实现了提取服务器控件的Id、类型的提取,代码如下:
源文件字符串:
<%@ Page Language= "VB " AutoEventWireup= "false " CodeFile= "Default.aspx.vb " Inherits= "_Default " %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= "http://www.w3.org/1999/xhtml " >
<head runat= "server ">
<title> 无标题页 </title>
</head>
<body>
<form id= "form1 " runat= "server ">
<div>
<input id= "Checkbox1 " style= "z-index: 103; left: 64px; position: absolute; top: 16px "
type= "checkbox " runat= "server " />
<asp:TextBox ID= "TextBox1 " runat= "server " Style= "z-index: 100; left: 240px; position: absolute;
top: 112px "> </asp:TextBox>
<asp:Label ID= "Label1 " runat= "server " Style= "z-index: 101; left: 128px; position: absolute;
top: 224px " Text= "Label "> </asp:Label>
<asp:ListBox ID= "ListBox1 " runat= "server " Style= "z-index: 102; left: 392px; position: absolute;
top: 72px "> </asp:ListBox>
</div>
</form>
</body>
</html>
正则表达式:
"\ <(? <TypeName> [a-zA-Z:]+)\s*(ID|id)=\ " "(? <IDName> \w+)\ " "\s*[^\> ]+runat=\ " "server\ " "[[^\> ]|[\s*]]+\> "
请帮我把提取控件名称的正则表达式(Name|name)=\ " "(? <ControlName> \w+)\ " "和提取类型的正则表达式(Type|type)=\ " "(? <Type> \w+)\ " "添加到上面正则表达式的合理位置中!
在线等答案!有了答案就结贴给分!呵呵!谢谢!
[解决办法]
关注一下,希望高手来解决一下
[解决办法]
学习..
[解决办法]
学习ing....希望高手来解决一下
[解决办法]
UP
[解决办法]
id跟控件名称,控件类型有啥区别?
------解决方案--------------------
Regex reg=new Regex(@ " <(? <TypeName> [a-zA-Z:]+?)\s*?id= " "(? <IDName> \w+?) " "[^> ]+?runat= " "server " "[^> ]+?> ",RegexOptions.IgnoreCase|RegexOptions.Singleline);
string TypeName,IDName,Type;
foreach( Match m in reg.Matches(str))
{
GroupCollection gc=m.Groups;
TypeName=gc[ "TypeName "].Value;
IDName=gc[ "IDName "].Value;
if(gc[ "TypeName "].Value.ToLower()== "input ")
Type=Regex.Match(gc[0].Value,@ "(? <=type= " ")\w+(?= " ") ",RegexOptions.IgnoreCase|RegexOptions.Singleline).Value;
}//写不到一起 分开写呗
[解决办法]
up
[解决办法]
想写到一起,确实有点难度...
一个个提取...
[解决办法]
或者这样试下
string yourStr = .............;
string typename, idname, type;
MatchCollection mc = Regex.Matches(yourStr, @ " <(? <TypeName> (input|asp:\w+))\s+id= " "(? <IDName> [^ " "]*?) " "([\s\S]*?type= " "(? <Type> [^ " "]*?) " ")?[^> ]*?> ", RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
typename = m.Groups[ "TypeName "].Value;
idname = m.Groups[ "IDName "].Value;
if (m.Groups[ "TypeName "].Value == "input ")
{
type = m.Groups[ "Type "].Value;
}
}
这里没有加Name,因为需要知道Name可能出现的位置,如果说IDName,TypeName,Name的相对位置是不固定的,要麻烦得多
[解决办法]
TO:IDName\TypeName\Name的相对位置是不固定的!
位置不固定,那你自己已经写好的正则表达式也有很大的局限性,最好的做好是对于每一个属性分别用正则来提取...
[解决办法]
学习,帮顶
[解决办法]
try..
string str= "... ";
string typeName, iDName, name, type, content;
RegexOptions option = RegexOptions.IgnoreCase | RegexOptions.Singleline;
MatchCollection mc = Regex.Matches(str, @ " <(? <TypeName> (input|asp:\w+))(? <Content> ([^> ]*?))> ", option);
foreach (Match m in mc)
{
typeName = m.Groups[ "TypeName "].Value;
content = m.Groups[ "Content "].Value;
iDName = Regex.Match(content, "id=\ "(.*?)\ " ", option).Groups[1].Value;
if (typeName.ToLower() == "input ")
{
//说明是input类型
type = Regex.IsMatch(content, "type=\ "(.*?)\ " ", option) ? (Regex.Match(content, "type=\ "(.*?)\ " ", option).Groups[1].Value) : " ";
Console.WriteLine( "TypeName: " + typeName + "\tIDName: " + iDName + "\tType: " + type);
}
else
{
//说明是asp类型
name = Regex.IsMatch(content, "name=\ "(.*?)\ " ", option) ? (Regex.Match(content, "name=\ "(.*?)\ " ", option).Groups[0].Value) : " ";
Console.WriteLine( "TypeName: " + typeName + "\tIDName: " + iDName + "\tName: " + name);
}
}
------解决方案--------------------
留名
[解决办法]
接分算了
[解决办法]
TypeName的位置应该是固定的,IDName、Type、Name的相对位置不固定,且可能有也可能没有,还是分别提取出来再处理吧