Regex.Match参数可能吗?

时间:2014-08-06 00:27:04

标签: c#

美好的一天,

我有一些HTML输入,我想进行搜索和替换操作。

string html = @"
    <div class=""left bottom-margin"">
    <input id=""0086"" maxlength=""29"" data-src=""200:80"" type=""text""><br />
    <input id=""0087"" maxlength=""38"" data-src=""201:80"" type=""text""><br />
    <input id=""0088"" maxlength=""38"" data-src=""202:80"" type=""text""><br />
</div>";    

// Here we call Regex.Match.
Match match = Regex.Match(html, @"(<input.*id=""0087"".*?>)", RegexOptions.IgnoreCase);

// Here we check the Match instance.
if (match.Success)
{
    // Finally, we get the Group value and display it.
    string key = match.Groups[1].Value;
    Console.WriteLine(key);
} else {
    Console.WriteLine("No Match...");
}

到目前为止,此代码确实有效,但我希望能够为Regex.Match初始化提供参数。这可能吗?如果我想搜索0086或0088作为ID怎么办?我有几百个这样的标签,我希望能够通过提供参数来找到HTML标签吗?

我知道@字符串是逐字的。

但我尝试过这样做:

// string pattern = "(<input.*id=\"\"0087\"\".*?>)";
// string pattern = "(<input.*id=\"\"" + "0087" + "\"\".*?>)";

这也不起作用。我见过的大多数Regex.Match样本都使用@verbatim符号来进行实际匹配。我对此的理解是否正确?

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您无法为正则表达式提供参数。但你可以......不要试图强迫正则表达式成为HTML解析器。

  • 如果您的文档包含有效标记,则可以将其加载到合适的XMLDocument中,并以多种不同方式应用所需的转换:
    • 以编程方式使用XPATH查询
    • 通过遍历文档找到您感兴趣的节点,
    • 应用XSLT转换。
    • 使用Linq for XML
  • 或者您可以安装HTML Agility Pack via NuGet,将文档加载到HTmlDocument并使用其转换功能。

如果你决定使用正则表达式,你可以

  • 动态构建正则表达式,如

    Regex ConstructRegex( int id )
    {
      string pattern = string.format( @"(<input.*id=""{0:0000}"".*?>)" , id ) ;
      Regex instance = new Regex( pattern ) ;
      return instance
    }
    
  • 使您的正则表达式具有通用性并提供MatchEvaluator / Func<Match,string>以对每个匹配应用所需的转换(如果需要):

    static readonly Regex rx = new Regex( @"(<input.*id=""(?<id>\d\d\d\d)"".*?>)" ) ;
    
    string Transform( string html , Func<string,string> transform )
    {
      string transformed = rx.Replace( html, transform ) ;
      return transformed ;
    }
    

    你可以这样使用:

    string raw    = "some html here" ;
    string cooked = Transform( raw , m => {
        int id = int.Parse( m.Groups["id"].Value ) ;
        string s = Match.Value ;
        if ( id == 86 )
        {
          s = apply_some_transformation_here(m.Value) ;
        }
        return s ;
      }) ;
    

答案 1 :(得分:0)

这个怎么样:

string pattern = String.Format(@"(<input.*id=""{0}"".*?>)", "0087");

看起来它对我来说很好。

实际上,即便如此也是如此:

string pattern = @"(<input.*id=""" + "0087" + @""".*?>)";