任何想法为什么这不起作用? C#

时间:2009-02-22 19:03:41

标签: c# regex

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”作为输出(在本例中)。

7 个答案:

答案 0 :(得分: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尝试的效果。

答案 1 :(得分:2)

试试这个:

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
}

答案 2 :(得分:1)

由于show_name之前的问号。它是输入但不是模式,因此不匹配。

此外,您尝试匹配</i但输入不包含此内容(它包含</li>)。

答案 3 :(得分:1)

你的案例中正确的正则表达式是

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

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

答案 4 :(得分:1)

/ = SHOW_NAME(。)及?show_name_exact =真\“&GT;(

会按照您的预期相信。但另一件事我注意到,你是想要获得组[1]的值,但我相信你想要组[2]的值,因为会有3组,第一组是匹配,第二个是第一组...

Gl;)

答案 5 :(得分:0)

首先正则表达式启动“/ show_name”,但目标字符串有“/?show_name”,因此第一个组不希望第一个预期命中。

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

答案 6 :(得分:0)

好的,让我们打破这个。

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

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

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

我们将从左侧开始,通过正则表达式向右走。

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

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

  3. "</i"变为"</a"此更改与您使用"</a>"标记终止该锚的实际文本相匹配。

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

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

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