【问题标题】:Any ideas why this does not work? C#任何想法为什么这不起作用? C#
【发布时间】:2009-02-22 19:03:41
【问题描述】:
public class MyExample
{

    public static void Main(String[] args)
    {


string input = "<a href=\"http://tvrss.net/search/?show_name=The+Venture+Bros&amp;show_name_exact=true\">The Venture Bros</a></p></li>";


    // Call Regex.Match
    Match m = Regex.Match(input, "/show_name=(.*?)&amp;show_name_exact=true\">(.*?)</i");

   // Check Match instance
    if (m.Success)
    {
        // Get Group value
        string key = m.Groups[1].Value;
        Console.WriteLine(key);
        // alternate-1
    }



    }

我想要“The Venture Bros”作为输出(在本例中)。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    试试这个:

    string input = "<a href=\"http://tvrss.net/search/?show_name=The+Venture+Bros&amp;show_name_exact=true\">The Venture Bros</a></p></li>";
    
    // Call Regex.Match
    Match m = Regex.Match(input, "show_name=(.*?)&amp;show_name_exact=true\">(.*?)</a");
    
    // Check Match instance
    if (m.Success)
    {
        // Get Group value
        string key = m.Groups[2].Value;
        Console.WriteLine(key);
        // alternate-1
    }
    

    【讨论】:

    • 换句话说,将正则表达式修饰符从 /i 更改为 /a,并取匹配数组的第三个元素而不是第二个 ("string key = m.Groups[2].Value" )。关于为什么这更好的一些解释也会增加这个答案的帮助。
    • 不,他不是那样做的。就像我说的那样,很多人对正则表达式修饰符感到困惑,它们在 C# 中不像那样工作。他不是在“更改正则表达式修饰符”,而是在末尾加上文字“/a”。
    • @Harleqin :代码比解释更多。我读了你的评论2次,明白你​​的意思。但是代码很明显,你可以看到你需要改变什么。
    【解决方案2】:

    我认为这是因为您尝试在前面和结尾处使用 perl 样式的斜线。其他几个回答者已经对此感到困惑。按照他的编写方式,他试图通过以 / 开头和结尾并在末尾加上 i 来做到不区分大小写,就像你在 perl 中那样。

    但我很确定 .NET 正则表达式不能那样工作,这就是导致问题的原因。

    编辑:更具体地说,查看 RegexOptions,我从 MSDN 中提取的一个示例是这样的:

    Dim rx As New Regex("\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    

    那里的关键是“RegexOptions.IgnoreCase”,这将导致您尝试使用 /pattern/i 的效果。

    【讨论】:

      【解决方案3】:

      在你的情况下正确的正则表达式是

      ^.*&amp;show_name_exact=true\"\>(.*)</a></p></li>$
      

      正则表达式很棘手,但在 http://www.regular-expressions.info/ 你可以找到一个很棒的教程

      【讨论】:

        【解决方案4】:

        /?show_name=(.)&show_name_exact=true\">(.)

        我相信会如你所愿。但我注意到的另一件事是,您正在尝试获取 group[1] 的值,但我相信您想要 group[2] 的值,因为将有 3 个组,第一个是匹配,并且第二个是第一组……

        Gl ;)

        【讨论】:

        • 是的,我认为很多人会感到困惑并忘记了 group[0] 是匹配的整个字符串。
        【解决方案5】:

        因为show_name前面的问号。它在输入中但不在模式中,因此不匹配。

        此外,您尝试匹配 &lt;/i,但输入不包含此内容(它包含 &lt;/li&gt;)。

        【讨论】:

        • 我试过这个:string input = "show_name=The+Venture+Bros&show_name_exact=true\">The Venture Bros"; .. . 匹配 m = Regex.Match(input, "/show_name=(.*?)&show_name_exact=true\">(.*?)");所以在输入中没有问号,但没有帮助。为什么?
        【解决方案6】:

        首先,正则表达式开始“/show_name”,但目标字符串有“/?show_name”,所以第一组不会想要第一个预期的命中。

        这将导致整个正则表达式失败。

        【讨论】:

          【解决方案7】:

          好的,让我们分解一下。

          测试数据:"&lt;a href=\"http://tvrss.net/search/?show_name=The+Venture+Bros&amp;amp;show_name_exact=true\"&gt;The Venture Bros&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;"

          原始正则表达式:"/show_name=(.*?)&amp;amp;show_name_exact=true\"&gt;(.*?)&lt;/i"

          工作正则表达式:"/\?show_name=(.*)&amp;amp;show_name_exact=true\"&gt;(.*)&lt;/a"

          我们将从左侧开始,然后通过正则表达式向右侧工作。

          1. “?”变成了“\?”这是因为一个“?”表示前面的字符或组是可选的。当我们在它前面加上一个斜线时,它现在匹配一个文字问号。

          2. "(.*?)" 变为"(.*)" 括号表示一个组,问号表示“可选”,但“*”已经表示“0 或更多”,所以这实际上只是消除了冗余。

          3. "&lt;/i" 变为 "&lt;/a" 进行此更改是为了匹配以 "&lt;/a&gt;" 标记终止锚点的实际文本。

          建议的正则表达式:"[\\W]show_name=([^&gt;&lt;\"]*)&amp;amp;show_name_exact=true\"&gt;([^&lt;]*)&lt;"

          (添加了额外的 \ 以提供正确的 c# 字符串转义。)

          在 c# 中测试正则表达式的好工具是 code.google.com 上的 regex-freetool

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-05
            • 2020-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多