正在分析多个组
本文关键字: | 更新日期: 2023-09-27 18:26:39
我有一个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,因为它包含非字母字符。
问:我的模式出了什么问题?
4个div的期望匹配:
<div id="div1">Street ___________________
______
<div id="div3">City _____________________
<div id="div4">City2 ____________________
_____
-
'w
只是一个单独的字符,您可能想说一个或多个-'w+
。 -
/*
-零个或多个/
?我看不出这在哪里合适。 -
一个或多个非
>
的(即[^>]+
)可能比.+?
更好。.+?
将尝试在第一个>
处停止,但将继续,直到找到匹配的字符串,即:<div id=1>this is not valid</div><div id=2>this is valid___</div>
将匹配整个字符串,而不是仅来自
<div id=2>
。 -
据我从你的问题中所知,下划线之前的所有内容都应该是可选的。
图案:
(?:(<div id[^>]+>)('w+))?([' _]{3,})
C#测试。
尝试类似的东西
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>
)