美好的一天,
我有一些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符号来进行实际匹配。我对此的理解是否正确?
有什么建议吗?
答案 0 :(得分:1)
您无法为正则表达式提供参数。但你可以......不要试图强迫正则表达式成为HTML解析器。
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" + @""".*?>)";