none
C#中正则表达式求助 RRS feed

  • 问题

  • 我想用正则取出 name="ddlProvC"的下拉框中选中的值如下: 我想匹配出 “广东”这两个字,

    HTML文本如下:

        <td style="padding-left: 10px; width: 43%;" align="left">
                                                                <select name="ddlProvC" id="ddlProvC" style="width:240px;">
     <option value="">--请选择--</option>
     <option value="01">北京</option>
     <option value="02">上海</option>
     <option value="03">天津</option>
     <option value="04">重庆</option>
     <option value="05">江苏</option>
     <option value="06">浙江</option>
     <option selected="selected" value="07">广东</option>
     <option value="08">海南</option>
     <option value="09">福建</option>
     <option value="10">山东</option>
     <option value="11">江西</option>
     <option value="12">四川</option>
     <option value="13">安徽</option>
     <option value="14">河北</option>
     <option value="15">河南</option>
     <option value="16">湖北</option>
     <option value="17">湖南</option>
    </select>&nbsp;<span class="red_num">*</span>
                                                            </td>
     <td style="padding-left: 10px; width: 80px; height: 22px;" align="left">
                                                                公司规模
                                                            </td>
                                                            <td style="padding-left: 10px; height: 22px;" align="left">
                                                                <select name="ddlCompanySizeC" id="ddlCompanySizeC" style="width:240px;">
     <option value="">--请选择--</option>
     <option value="1">少于50人</option>
     <option selected="selected" value="2">50-150人</option>
     <option value="3">150-500人</option>
     <option value="4">500-1000人</option>
     <option value="5">1000-5000人</option>
     <option value="6">5000-10000人</option>
     <option value="7">10000人以上</option>

    </select>&nbsp;<span class="red_num">*</span>
                                                            </td>



    2013年9月20日 3:11

答案

  • 试试这个:

    <select name="ddlProvC".*?>.*?<option selected="selected".*?>(.*?)</option>.*?</select>

    group[1]就是要找的值。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 stoneca 2013年9月21日 9:44
    2013年9月20日 10:12
    版主
  • 我想取出HTML文本中 name="ddlProvC" 或 id="ddlProvC" 选中的值 ,

    这是一个前提条件。 谢谢!您没有理解我的意思。

    非常抱歉,刚才有些性急了,现在交上答案,希望满意;)

     string s = File.ReadAllText("TextFile1.txt").Trim();

    这句是我自己创建了一个文本文件,然后把你Html内容拷贝进去后读取,你完全可以替换自己需要的文本。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text.RegularExpressions;
     
    namespace CSharp
    {
        class Program
        {
            static void Main()
            {
                //取出全部的<option selected元素>
                string strPattern = @"(?<=<select\sname=""ddlProvC"".*?>).*(?=</select>)";
                string s = File.ReadAllText("TextFile1.txt").Trim();
     
                //设置SingleLine,防止换行符不算其中
                Regex reg = new Regex(strPattern,RegexOptions.Singleline);
                s = reg.Match(s).Value.Trim();
     
                //再次过滤
                strPattern = @"(?<=<option\sselected=""selected"".*?>).*?(?=</option>)";
                reg = new Regex(strPatternRegexOptions.Singleline);
                s = reg.Match(s).Value.Trim();
     
                Console.WriteLine(s);
     
            }
        }
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 9:05
    版主

全部回复

  • 如果你运行界面,会弹出一个下拉列表框,你选择“广东”就可以了,(Value为07),为什么要正则呢?

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月20日 5:09
    版主
  • 试试这个:

    <select name="ddlProvC".*?>.*?<option selected="selected".*?>(.*?)</option>.*?</select>

    group[1]就是要找的值。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 stoneca 2013年9月21日 9:44
    2013年9月20日 10:12
    版主
  • 谢谢您的回复,经试验,匹配不到.
    <select name="ddlProvC".*?>.*?<option selected="selected".*?>(.*?)</option>.*?</select>
    2013年9月21日 5:32
  • 没有理解你的意思——既然你想匹配“广东”,为何不直接在正则中就输入“广东”?

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 5:45
    版主
  • <option\sselected="selected".*?>(.*?)</option>

    可以匹配出  广东, 50-150人 , 但要怎么做,会只匹配出 “广东” 呢。

    2013年9月21日 5:55
  • 我假定你有多个地方存在“广东”,且只要取出这一个词,尝试这个方案:

     Regex reg = new Regex("广东");
    


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 6:11
    版主
  • 我想取出HTML文本中 name="ddlProvC" 或 id="ddlProvC" 选中的值 :<option selected="selected" value="07">广东</option>.

    这样说大家能理解么?

    大家不用去分析应用场景,就当作一个正则表达式的考试题来思考就好了。


    • 已编辑 stoneca 2013年9月21日 6:17
    2013年9月21日 6:16
  • 我突然理解你的意思了,你是指说筛选出某个选中值的内容对吧?那你完全可以这样说嘛,呵呵:

     Regex reg = new Regex("<option\\sselected=\"selected\".*?>(.*?)</option>");
                string s = File.ReadAllText("TextFile1.txt");  
    //以上文本文件包含要筛选的内容             s = (reg.Match(s).Value);             reg = new Regex("[\u4e00-\u9fa5]{1,}");             Console.WriteLine(reg.Match(s).Value);


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 6:29
    版主
  • 试试这个:

    <select name="ddlProvC".*?>.*?<option selected="selected".*?>(.*?)</option>.*?</select>

    group[1]就是要找的值。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    这样匹配出来的是两个结果,可以通过Matches方法来获得匹配项的集合对象MatchCollection ,然后通过Item[index]索引的方式来取得你所要的,具体示例代码可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/e7sf90t3.aspx


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年9月21日 6:29
  • 试试这个:

    <select name="ddlProvC".*?>.*?<option selected="selected".*?>(.*?)</option>.*?</select>

    group[1]就是要找的值。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    这样匹配出来的是两个结果,可以通过Matches方法来获得匹配项的集合对象MatchCollection ,然后通过Item[index]索引的方式来取得你所要的,具体示例代码可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/e7sf90t3.aspx


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    谢谢您的回复,真的匹配不出来,

    <option\sselected="selected".*?>(.*?)</option>

    可以匹配出  广东, 50-150人 , 但要怎么做,才会匹配出  name="ddlProvC"的选中值 “广东” 呢。

    2013年9月21日 6:46
  • 我突然理解你的意思了,你是指说筛选出某个选中值的内容对吧?那你完全可以这样说嘛,呵呵:

     Regex reg = new Regex("<option\\sselected=\"selected\".*?>(.*?)</option>");
                string s = File.ReadAllText("TextFile1.txt");
                s = (reg.Match(s).Value);
                reg = new Regex("[\u4e00-\u9fa5]{1,}");
                Console.WriteLine(reg.Match(s).Value);


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report


    我想取出HTML文本中 name="ddlProvC" 或 id="ddlProvC" 选中的值 :<option selected="selected" value="07">广东</option>.

    这样说大家能理解么?

    2013年9月21日 6:49
  • 是的,已经取出来了,你看看吧——广东

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 7:23
    版主
  • 非常感谢 Learning hard 的答案:

    1 把上面那段HTML中的 文本中,所有换行符替换掉

    2 匹配模式改为这样:

    <select\sname="ddlProvC".*?>.*?<option\sselected="selected".*?>(.*?)</option>.*?<.*?/select>

    可以匹配出来。

    但由此引出一个新问题, C#中正则如何匹配多行文本?

    我用了正则测试工具:regulator.sourceforge.net

    以为测试工具有问题,又自己写了代码测试了,也只能匹配单行,代码如下:

                string strPattern = @"<select\sname=""ddlProvC"".*?>.*?<option\sselected=""selected"".*?>(.*?)</option>.*?<.*?/select>";
                RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.IgnoreCase;
                Regex reg = new Regex(strPattern, options);
                MatchCollection matches = reg.Matches(this.txtInput.Text);
                this.textOutput.Text = "";
                if (matches.Count < 1) { return; }
                foreach (Match m in matches)
                {
                    if (m.Groups.Count >= 1)
                    {
                        this.textOutput.Text += m.Groups[1].Value; 
                    } 
                }
    难到C#中的正则就不能匹配多行? 不理解为何这样。。。。。。



    • 已编辑 stoneca 2013年9月21日 7:48
    2013年9月21日 7:45
  • Hi stoneca,

    我的方法是先取出“选中”的那个Html全部的文本,然后进一步取出中间的内容(汉字部分),我测试是可以的,你试过吗?


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 7:52
    版主
  • Hi stoneca,

    我的方法是先取出“选中”的那个Html全部的文本,然后进一步取出中间的内容(汉字部分),我测试是可以的,你试过吗?


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    我想取出HTML文本中 name="ddlProvC" 或 id="ddlProvC" 选中的值 ,

    这是一个前提条件。 谢谢!您没有理解我的意思。

    2013年9月21日 8:02
  • 我想取出HTML文本中 name="ddlProvC" 或 id="ddlProvC" 选中的值 ,

    这是一个前提条件。 谢谢!您没有理解我的意思。

    非常抱歉,刚才有些性急了,现在交上答案,希望满意;)

     string s = File.ReadAllText("TextFile1.txt").Trim();

    这句是我自己创建了一个文本文件,然后把你Html内容拷贝进去后读取,你完全可以替换自己需要的文本。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text.RegularExpressions;
     
    namespace CSharp
    {
        class Program
        {
            static void Main()
            {
                //取出全部的<option selected元素>
                string strPattern = @"(?<=<select\sname=""ddlProvC"".*?>).*(?=</select>)";
                string s = File.ReadAllText("TextFile1.txt").Trim();
     
                //设置SingleLine,防止换行符不算其中
                Regex reg = new Regex(strPattern,RegexOptions.Singleline);
                s = reg.Match(s).Value.Trim();
     
                //再次过滤
                strPattern = @"(?<=<option\sselected=""selected"".*?>).*?(?=</option>)";
                reg = new Regex(strPatternRegexOptions.Singleline);
                s = reg.Match(s).Value.Trim();
     
                Console.WriteLine(s);
     
            }
        }
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 9:05
    版主
  • //设置SingleLine,防止换行符不算其中

    Regex reg = new Regex(strPattern,RegexOptions.Singleline);

    我对 这个 RegexOptions.Singlelin 和 RegexOptions.Multiline 理解错了, 所以就匹配不出来了,

     
    如果用类似下面这种方式,可以匹配出来吗?

    (?<=\<option\sselected="selected"\svalue="[\d]*">).*?(?=\</option>)

    但这样不能精确到 name="ddlProvC", 有人可以帮我改进一下吗?
    • 已编辑 stoneca 2013年9月21日 9:58
    2013年9月21日 9:42
  • 如果用类似下面这种方式,可以匹配出来吗?

    (?<=\<option\sselected="selected"\svalue="[\d]*">).*?(?=\</option>)

    但这样不能精确到 name="ddlProvC", 有人可以帮我改进一下吗?
     

    //再次过滤strPattern

    =@"(?<=\<option\sselected=""selected""\svalue=""[\d]*"">).*?(?=</option>)";

      


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月21日 10:03
    版主
  • 我希望可以用表达式一次性匹配出来。

    不分两次去匹配。

    2013年9月21日 16:05
  • 我希望可以用表达式一次性匹配出来。

    不分两次去匹配。

    string strPattern = @"(?<=<select\sname=""ddlProvC"".*<option\sselected=""selected"".*?>).*?(?=</option>.*</select>)";

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report


    2013年9月22日 1:54
    版主
  •  这样匹配出的不对。测试结果如图, 很多不需要的东西也匹配出来了。

    如果改为 :

    (?<=\<select\sname="ddlProvC".*\<option\sselected="selected".*?>)[\w\-]+[^\<]

    结果也是匹配出一些多余项:

    • 已编辑 stoneca 2013年9月22日 5:24
    2013年9月22日 4:48
  • 不会啊,我只匹配到了广东。我用VS2012写的,你可以运行看看:

    点击此处下载

    下载CSharp那个示例代码看看


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月22日 5:06
    版主
  • :)  您用了 reg.Match(s).Value, 当然只会匹配一个。

    如果 reg.Matches(s) ;  就可以看到究竟匹配了多少个。 当然,用您上面这种方法已经可以解决这个问题了。

    我之所以想尝试这样做,也是想考验一下自己, 加深自己对正则表达式的一些理解。

    如何  reg.Matches(s) 时只匹配出一个呢? (?<=\<select\sname="ddlProvC".*\<option\sselected="selected"\svalue="[\w]*">)[\w\-]*[^\<], 其中 \<option\sselected="selected"\svalue="[\w]*"> 这个部分是否可以用 {1}之类的限制只匹配一次么 ? 即 : select name="ddlProvC" 只取一次 option selected="selected" 的值。

    非常感谢您的解答!

    2013年9月22日 6:03
  • 是的,我也觉得很奇怪,为什么会匹配那么多项……我一下子想不出更好的办法,呵呵。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月22日 9:21
    版主
  • 你好:

    我刚抽时间测试了一下,这个正则表达式是可以匹配出第一个select下选中的值的:

    <select name=\"ddlProvC\".*?>.*?<option.*?selected=\"selected\".*?>(.*?)</option>.*?</select>

     测试代码如下:

    string input = File.ReadAllText("test.txt");
                string pattern = "<select name=\"ddlProvC\" id=\"ddlProvC\" style=\"width:240px;\">.*?<option.*?selected=\"selected\".*?>(.*?)</option>.*?</select>";
                Regex reg = new Regex(pattern, RegexOptions.Singleline);
                foreach (Match m in reg.Matches(input))
                {
                    Console.WriteLine(m.Groups[1].Value);
                }

    你可以试试看。我的测试结果是确实可以匹配出名为ddlProvC的select中已经选中的值的。下面那个名为ddlCompanySizeC的select中选中的值是匹配不出来的,也就是说“50-150人”的那个选项不会匹配上。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2013年9月22日 12:22
    版主
  • 我说过了,我不想从group中进行取值,

    我希望可以  (?<=\<select\sname="ddlProvC".*\<option\sselected="selected".*?>)[\w\-]+[^\<]

    之类的形式,从match.Value中取值,并且 reg.Matches(s).Count = 1, 我想知道有没有办法可以做到这点。

    如果无法实现,可否说明一下,为什么无法实现,这个思路有什么问题?
    • 已编辑 stoneca 2013年9月26日 0:17
    2013年9月26日 0:14
  • 你的意思是你确定你只会去匹配其中的一条记录而不是多条记录是吗?

    “我说过了,我不想从group中进行取值”,为什么不想从Group中取值呢?有原因吗?能匹配到想要的记录不就可以了吗?

    我觉得你即使用Match而不用Matches也还是要用Groups去取值,因为你想匹配的那条记录是在name="ddlProvC"这个select里面的,首先你要匹配出这个select才能找到其中被选中的option。

    我不知道代码稍微修改下是否就符合你的要求了?

    string input = File.ReadAllText("test.txt");
                string pattern = "<select name=\"ddlProvC\" id=\"ddlProvC\" style=\"width:240px;\">.*?<option.*?selected=\"selected\".*?>(.*?)</option>.*?</select>";
                Regex reg = new Regex(pattern, RegexOptions.Singleline);
                Match m = reg.Match(input);
                if (m.Success)
                {
                    Console.WriteLine(m.Groups[1].Value);
                }
    顺便说一下,其实match.Value和match.Groups[0]其实是一样的。

    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.



    2013年9月26日 2:09
    版主
  • Hello Caillen Zhong ,我认为你的方法是可以取出这个值的,没有问题。思路也很清晰。

    不过我更想知道有没有其它的方法,或者说我的想法有没有可能实现,问题出在哪了?

    谢谢您的解答!

    用(?>=  ...... )  ......   (?= ......)  这种方式可以匹配的出来吗? Why ?

    2013年9月26日 7:25
  • ?>=还有?=是正则表达式中的语法吗?这个真不懂。

    我的意思是只要可以快速的匹配到结果就可以了,有些地方没有必要去钻牛角尖。


    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月26日 9:49
    版主
  • 不好意思,写错了:用(?<=  ...... )  ......   (?= ......)  这种方式可以匹配的出来吗? Why ?

    我上面已经写过了: (?<=\<select\sname="ddlProvC".*\<option\sselected="selected".*?>)[\w\-]+[^\<]

    解释:(?<= 子表达式)...... (?= 子表达式)


    • 已编辑 stoneca 2013年9月27日 5:40
    2013年9月27日 5:37