regex 使用哪个正则表达式只检索没有重复字符的文本?

brjng4g3  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个下面的字符串:

<pre>one</pre><p><b>two</b></p>\n<pre>DO NOT    MATCH</pre><pre>BALLS</pre>

我想匹配<pre></pre>标记并将其替换为<p></p>
我不想匹配带有多个空格的部件

<pre>DO NOT!    !MATCH</pre>

下面是我的正则表达式:

<pre>((?:[^\n]+?))</pre>

它匹配<pre></pre>标记中位于一行上的所有标记。
实际结果:

<p>one</p>
<p><b>two</b></p>\n<p>DO    NOT    MATCH</p>
<p>BALLS</p>

预期结果:

<p>one</p>
<p><b>two</b></p>\n
<p>BALLS</p>

C# flavor demo

hgqdbh6s

hgqdbh6s1#

免责声明:把这当作一个练习。如果你打算在真实的世界的开发中做类似的事情-请不要这样做。使用HTML解析器代替。
因为你基本上需要两个不同的变化:将好的<pre>转换为<p>并删除坏的<pre>让我们分两步来做:

string input = "<pre>one</pre><p><b>two</b></p>\n<pre>DO    NOT    MATCH</pre><pre>BALLS</pre>";

Regex regex_replace = new Regex(@"<pre>((?:(?<!\s{3})(?!</?pre>)[^\n])+?)</pre>");
Regex regex_delete = new Regex(@"<pre>[^\n]*?</pre>");

string result = regex_delete.Replace(regex_replace.Replace(input, "<p>$1</p>\n"), "");
Console.WriteLine(result);

输出:

<p>one</p>
<p><b>two</b></p>
<p>BALLS</p>

在这里,regex_replace用于将良好的<pre>替换为<p>。它匹配不包含其他pre或三个后续空白符号的<pre>
regex_delete删除所有其他pre。

twh00eeo

twh00eeo2#

如果你完全控制HTML输入,你可以使用这个正则表达式:

<pre>((?:[^<\s]\s?)*)</pre>

(?:[^<\s]\s?)*代表“一个非空字符序列,除了<,后面最多有一个空格,整个过程重复0次或多次”。
然后将该序列捕获到组$1Demo)中。
正如其他人所说,不要使用正则表达式来解析常规HTML内容,或者任何不属于常规语言的东西。

相关问题