结合正则表达式在C#中提取数据

时间:2016-10-05 10:33:46

标签: c# regex tuples

我有一个包含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>

我的目标是迭代每一行并且:

  1. 提取文字。
  2. 检查字符串是否包含 class =&#34; Marker&#34;
  3. 将此信息存储在列表中。

    我想首先从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存在与否(例如在一个元组中)?

1 个答案:

答案 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标记。