您的位置:程序门 -> .net技术 -> c#



抢分咯!简单正则表达式问题(已有部分代码)!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


抢分咯!简单正则表达式问题(已有部分代码)![已结贴,结贴人:xueweiheng]
发表于:2007-03-15 09:12:21 楼主
我要从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>
                &nbsp;
                <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+)\ " "添加到上面正则表达式的合理位置中!

在线等答案!有了答案就结贴给分!呵呵!谢谢!


发表于:2007-03-15 09:29:221楼 得分:20
关注一下,希望高手来解决一下
发表于:2007-03-15 09:54:452楼 得分:5
学习..
发表于:2007-03-15 10:01:533楼 得分:5
学习ing....希望高手来解决一下
发表于:2007-03-15 10:20:284楼 得分:2
up
发表于:2007-03-15 10:20:365楼 得分:2
id跟控件名称,控件类型有啥区别?
发表于:2007-03-15 10:31:446楼 得分:15
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;
}//写不到一起   分开写呗
发表于:2007-03-15 10:34:047楼 得分:2
up
发表于:2007-03-15 10:36:378楼 得分:2
想写到一起,确实有点难度...

一个个提取...
发表于:2007-03-15 11:13:389楼 得分:10
或者这样试下

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的相对位置是不固定的,要麻烦得多
发表于:2007-03-15 11:37:0210楼 得分:0
谢谢!您说的对,idname\typename\name的相对位置是不固定的!
发表于:2007-03-15 11:48:5311楼 得分:0
回复“id跟控件名称,控件类型有啥区别?”

我这里id就不用做详细解释了,是页面中分给控件的唯一标示
控件类型     比如: <asp:button...> <input...> 也就是我们编程中说的数据类型
控件名称主要是用于把一些相关联的一组控件组合在一起,以便对它们进行编程操作
发表于:2007-03-15 12:36:4812楼 得分:5
to:idname\typename\name的相对位置是不固定的!

位置不固定,那你自己已经写好的正则表达式也有很大的局限性,最好的做好是对于每一个属性分别用正则来提取...
发表于:2007-03-15 12:37:0413楼 得分:0
to:idname\typename\name的相对位置是不固定的!

位置不固定,那你自己已经写好的正则表达式也有很大的局限性,最好的做好是对于每一个属性分别用正则来提取...
发表于:2007-03-15 12:42:5814楼 得分:2
学习,帮顶
发表于:2007-03-15 13:15:4915楼 得分:24
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);
                                }
                        }
发表于:2007-03-15 13:16:4916楼 得分:0
输出:

typename:   input idname:   checkbox1 type:   checkbox
typename:   asp:textbox idname:   textbox1 name:  
typename:   asp:label idname:   label1 name:  
typename:   asp:listbox idname:   listbox1 name:
发表于:2007-03-15 13:42:4717楼 得分:2
留名
发表于:2007-03-15 13:47:3818楼 得分:2
接分算了
发表于:2007-03-15 14:02:0919楼 得分:2
typename的位置应该是固定的,idname、type、name的相对位置不固定,且可能有也可能没有,还是分别提取出来再处理吧
发表于:2007-03-15 15:23:1820楼 得分:0
谢谢大家的关心和支持,现在我把完整的代码贴出来,希望能供大家学习研究使用!知道这不是最好的办法,但解决了就不错!呵呵!见笑了!

先说明取出的是服务器控件
dim   matcontrolname   as   new   regex( "(name ¦name)=\ " "(? <controlname> \w+)\ " " ")
dim   strcontrolname   as   string   =   " "     ' ' ' ' '控件名称

dim   mattype   as   new   regex( "(type ¦type)=\ " "(? <type> \w+)\ " " ")
dim   strtype   as   string   =   " "                   ' ' ' '控件类型在input控件中使用

dim   match   as   match
filereader   =   my.computer.filesystem.readalltext(aspx文件的路径)
               
dim   mattypenameidname   as   new   regex( "\ <(? <typename> [a-za-z:]+)\s*(id ¦id)=\ " "(? <idname> \w+)\ " "[^\> +]+\> ")
dim   strtypename   as   string   =   " "   ' ' ' '控件数据类型
dim   stridname   as   string   =   " "       ' ' ' '控件id名称
dim   matrunserver   as   new   regex( "runat=\ " "server\ " " ")
dim   strrunserver   as   string   =   " "

match   =   mattypenameidname.match(filereader)
do   while   match.success
  if   matrunserver.match(match.value).success   then
    strtypename   =   match.groups( "typename ").value
    stridname   =   match.groups( "idname ").value
    strcontrolname   =   matcontrolname.match(match.value).groups( "controlname ").value
    strtype   =   mattype.match(match.value).groups( "type ").value
    match   =   match.nextmatch
  end   if
loop
发表于:2007-03-15 16:32:0721楼 得分:0
写个   鸟-   代码啊,别他   -   妈   -砌代码了,原理都搞不懂,还   -   他   -   妈   正则呢。

首先根据需要定义自动机。
(自动机可以非常简单的变成解析代码,小学水平就可以,其实根本不需要什么其他的库。)
如果按照楼主的要求,那就多此一举的将自动机转换为正则表达式,这个需要看看编译原理,不难。

coder太多了,看腻味了,发泄下。


快速检索

最新资讯
热门点击