哪个正则表达式用于检索文本没有重复字符?



我有以下字符串:

<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#风格的演示

免责声明:将此视为练习。如果你打算在现实世界的开发中做类似的事情-请不要。请使用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被用来用<p>代替好的<pre>。它匹配不包含其他pre或后续三个空白符号的<pre>

regex_delete删除所有其他pre。

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

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

(?:[^<s]s?)*表示"除<外的非空白字符序列,后面最多有一个空格,整个字符重复0次或多次"。

该序列随后被捕获到组$1(Demo)中。


正如其他人所说,不要使用regex来解析常规的HTML内容,或者任何不属于常规语言的内容。

最新更新