更好的正则表达式从html文本中获取匹配的组?

时间:2018-09-25 10:53:31

标签: c# regex

我有一个文本,其中将包含带有html span标签的纯文本,我需要从该文本中提取匹配的组。

示例文字:

<p>This is post 
  <span class='atwho-inserted' data-atwho-at-query='#' data-channel-tag='true'>
   <span data-value='CR345sdfqDdjPuEbsAQ=='>newpost</span></span>
  &nbsp; with intention to make 
  <span class='atwho-inserted' data-atwho-at-query='#' data-channel-tag='true'>
   <span data-value='CRsdf345DdjPuEbsAQ=='>newchannel</span></span>
   &nbsp; and see how 
  <span class='atwho-inserted' data-atwho-at-query='#' data-channel-tag='true'>
  <span data-value='Ce3DzasdfdqqDdjPuEbsAQ=='>textforthis</span></span>
  &nbsp; gets genrated.
</p>

现在我要从中提取的是服务器端正则表达式中的newpost,newchannel,textforthis组匹配。

我尝试的方法如下

New Regex("<span [^>]*?data-value=[\\""|']{1,2}[^""']*[\\""|']>(?<hashtag>[^""<\/]+)<\/span>", RegexOptions.Compiled)

哪些作品很棒,并给了我所需的小组。但是我不擅长编写正则表达式,并且在考虑可以优化此正则表达式吗?

Here is the RegExr link

1 个答案:

答案 0 :(得分:1)

为了优化正则表达式,您有几种选择。灵活性将是一个奖励。

这四个正则表达式的步骤比您提供的2个正则表达式(3785和1296)要少

  1. 如果可以确定要获取的Android仅具有spans属性,则可以使用:data-value请参见 {{3} } 。我认为这是最快的解决方案( 279个步骤)。但是,如果<span data-value[^>]+>(?<hashtag>[^\s<]+)span之前有一些其他属性,它将失败
  2. Demodata-value)在概念上与案例1类似。它并不慢( 342步)并且可以处理<span (?>[^>d]*)data-value[^>]+>(?<hashtag>[^\s<]+)之前的属性只要上面没有data-value字母
  3. Thisd)在任何情况下都可以使用,即使您在<span (?>(?>[^>d]*)(?(?=data-value)[^>]+|d))*>(?<hashtag>[^\s<]+)之前找到了一些属性。这是 903步
  4. Thisdata-value)也适用于任何情况。它更易于阅读,但会花费更多( 1146个步骤

此外,我认为步骤数只是一个起点或指南。最后,我将依靠一些基准来决定。