我有一个包含HTML的字符串,其硬编码格式如下:
<span class="Marker" id="a">Some text 1</span><br>
<span class="Marker" id="b">Some text 2</span><br>
<span class="Marker" id="c">Some text 2</span><br>
<p class="inactive">Some text 4</p>
<p class="inactive">Some text 5</p>
我的目标是迭代每一行并且:
将此信息存储在列表中。
我想首先从HTML中提取文本并将它们保存到列表中,所以我有以下内容:
//(?<=>) -> Lookbehind
//(?=<) -> Lookahead
var matches = Regex.Matches(htmlString, "(?<=>)([^<]+)(?=<)");
List<string> list = new List<string>();
foreach (Match match in matches)
{
list.Add(match.Value);
}
这可以按预期工作。现在我想检测每个字符串是否包含字符串class =&#34; Marker&#34;所以我有以下内容:
var classes = Regex.Matches(html, "(?<=<span class=\")([A-Za-z]+)(?=\")");
List<bool> isPresentList = new List<bool>();
foreach (Match cl in classes)
{
bool isPresent = cl.ToString().Equals("Marker", StringComparison.Ordinal);
isPresentList.Add(isPresent);
}
这也可以按预期工作,但如果可能的话,我希望能够一步到位。
有没有办法将Regex过滤器组合在一起,所以我返回了文本,如果Marker存在与否(例如在一个元组中)?
答案 0 :(得分:1)
如下所示的RegEx怎么样?
<([\w]*) class="(\w*)"[ =\w"]*>([ \w]*)<\/\1>
其中包含一个反向引用\1
到捕获标记名([\w]*)
的组。标记(类名)也使用class="(\w*)"
捕获。
如果html标记内的文字可能包含标点符号,您可能希望将[ \w]
部分更改为其他内容,例如(.*?)
将使用Lazy Quantifier捕获任何字符
有关使用您提供的数据的示例,请参阅:https://regex101.com/r/Ufluqs/2。
警告:由于多种原因,您可能无法使用RegEx方法,例如,如果html属性是以不同的顺序编写的,或者是嵌套的html标记。