我有一个HTML文件(我不能使用HTML AgilityPack),我想提取div的id(如果有的话)
<div id="div1">Street ___________________ </div>
<div id="div2">CAP |__|__|__|__|__| number ______ </div>
<div id="div3">City _____________________ State |__|__|</div>
<div id="div4">City2 ____________________ State2 _____</div>
我有一个提取下划线的模式 __ :[\ _]{3,}
现在,如果我在下划线前面有一个div,我想提取它,如果不是,我只会得到下划线。
到目前为止,我已经构建了这种模式(<div id(.+?)>(\w)([\ _]{3,}/*))([\ _]{3,})
第一部分是3组 1 - div标签,2 - 标签,3 - 下划线
1 - <div id(.+?)>
,2 - (\w)
,3 - [\ _]{3,}/*
id为div2的div不会使用id,因为它包含非alfanumeric字符。
问:我的模式出了什么问题?
4个div的所需匹配:
<div id="div1">Street ___________________
______
<div id="div3">City _____________________
<div id="div4">City2 ____________________
_____
答案 0 :(得分:1)
\w
只是一个字符,您可能想说一个或多个 - \w+
。
/*
- 零个或多个/
?我看不出它适合的地方。
一个或多个非>
(即[^>]+
)可能比.+?
更好。 .+?
将尝试停在第一个>
,但会一直持续到找到匹配的字符串,即:
<div id=1>this is not valid</div><div id=2>this is valid___</div>
将匹配整个字符串,而不仅仅是<div id=2>
。
就我的问题而言,下划线前的所有内容都应该是可选的。
模式:
(?:(<div id[^>]+>)(\w+))?([\ _]{3,})
答案 1 :(得分:1)
尝试类似
的内容string html = @"<div id=""div1"">Street ___________________ </div>
<div id=""div2"">CAP |__|__|__|__|__| number ______ </div>
<div id=""div3"">City _____________________ State |__|__|</div>
<div name=""hello"" id=""div4"">City _____________________ State |__|__|</div>
<div name=""house"">City _____________________ State |__|__|</div>
<div id=""notext""></div>";
var rx = new Regex(@"<div(?:(?: id=""(?<id>[^""]+)"")|[^>])*>(?<content>[^<]*)</div>",
RegexOptions.IgnoreCase);
var matches = rx.Matches(html);
foreach (Match match in matches)
{
var id = match.Groups["id"];
var content = match.Groups["content"];
Console.WriteLine("id present: {0}, id: {1}, text: {2}",
id.Success,
id.ToString(),
content.ToString());
}
如果有效,我将解释正则表达式(即<div(?:(?: id="(?<id>[^"]+)")|[^>])*>(?<content>[^<]*)</div>
)