【问题标题】:.Net Regex match grouping and repetition question.Net Regex 匹配分组和重复问题
【发布时间】:2023-03-28 04:18:01
【问题描述】:

我在 ASP.Net 应用程序中有以下 VB.Net 2.0:

output = Regex.Replace(output, "<p>(?:(?:\<\!\-\-.*?\-\-\>)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p>", String.Empty, RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Singleline)

很好匹配的示例:

  • &lt;p&gt;&lt;/p&gt;
  • &lt;p&gt; &lt;/p&gt;
  • &lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
  • &lt;p&gt;&lt;!-- comment --&gt;&lt;!-- comment --&gt;&lt;/p&gt;
  • &lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
  • &lt;p&gt;&lt;br/&gt;&amp;nbsp;&lt;/p&gt;
  • &lt;p&gt;&lt;!-- comment --&gt;&lt;br/&gt;&lt;!-- comment --&gt;&lt;/p&gt;
  • &lt;p&gt;&amp;nbsp;&lt;br/&gt;&lt;/p&gt;

我想匹配但不匹配的示例:

  • &lt;p &gt; &lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt; &lt;!--[endif]--&gt;&lt;/p&gt;

我如何使小组和重复按我想要的方式工作?

编辑: 哎呀,忘记评论组了。 编辑 #2: 糟糕,忘记了失败。 编辑 #3: 固定示例。 编辑#4:根据答案更新正则表达式

结论:

这是我对所有三个答案的基准测试结果。由于这三个现在都匹配了所有内容,因此我在一个文本块上运行了 10,000 次迭代:

Mine:
<p\s*>(?:(?:<!--.*?-->)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p>
6.312

Gumbo:
<p\s*>(?:[\s\u00A0]+|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|<!--(?:[^-]+|-(?!-))*-->)*</p>
6.05

steamer25:
<p\s*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>
6.121

Gumbo 的答案是最快的,所以我将他标记为正确答案。

【问题讨论】:

  • 你想做什么?
  • 我正在尝试从仅包含以下内容的 html 内容中去除所有 P 标签:html cmets、不间断空格、BR 元素或空白字符。

标签: .net asp.net vb.net regex asp.net-2.0


【解决方案1】:

试试这个正则表达式:

<p\s*>(?:[\s\u00A0]+|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|<!--(?:[^-]+|-(?!-))*-->)*</p>

【讨论】:

  • 似乎在某处缺少')'
  • 啊,我不得不转义 '#' 似乎仍然与最后一项不匹配
【解决方案2】:

啊!我看到了我的问题,它在 P 标签本身,而不是分组。

<p\s*>(?:(?:<!--.*?-->)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p>

注意标签中的 \s*。给大家加分!

【讨论】:

    【解决方案3】:
    <p\s*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>
    

    你不需要转义尖括号,我已经添加了cmets。

    【讨论】:

    • 感谢尖括号上的提示仍然与最后一项不匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2010-11-08
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多