我有以下字符串:
<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内容,或者任何不属于常规语言的内容。