将除 <pre> 标签内以外的换行符替换为 <pre> 标签内的括号 (<>)

har*_*ath 5 regex regex-negation regex-greedy

我使用问题中可用的答案替换了预标记之外的所有换行符。

\n(?![^<]*<\/pre>)
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到预标记中的内容有 < 或 > 括号。

例如,输入:

<p>Test contennt for regex
with line breaks</p>
<pre>code block 
with multi line content
working fine</pre>
<pre class="brush:C#">
test line break before 
open paranthesis < is not working fine
line breaks after paranthesis
is accepted
</pre>
Run Code Online (Sandbox Code Playgroud)

输出是

<p>Test contennt for regexwith line breaks</p><pre>code block 
with multi line content
working fine</pre><pre class="brush:C#">test line break before open paranthesis < is not working fine
line breaks after paranthesis
is accepted
</pre>
Run Code Online (Sandbox Code Playgroud)

这是不正确的 - 并非所有换行符都被删除。

请参阅此 regex101

Cer*_*nce 2

尝试这个:

/\n(?=((?!<\/pre).)*?(<pre|$))/sg
Run Code Online (Sandbox Code Playgroud)

这个想法是要有远见。这

((?!<\/pre).)*?
Run Code Online (Sandbox Code Playgroud)

重复匹配任何字符(包括带有 的换行符.),其后是

(<pre|$)
Run Code Online (Sandbox Code Playgroud)

要求上述字符不是in <</pre然后,匹配其中一个<pre(表明原始换行符不在<pre或匹配文件末尾。

https://regex101.com/r/cjZQO9/2

输入为

<p>Test contennt for regex
with line breaks</p>
<pre>code block 
with multi line content
working fine</pre>
text
more text
<pre class="brush:C#">
test line break before 
open paranthesis < is not working fine
line breaks after paranthesis
is accepted
</pre>
text
Run Code Online (Sandbox Code Playgroud)

输出是

<p>Test contennt for regexwith line breaks</p><pre>code block 
with multi line content
working fine</pre>textmore text<pre class="brush:C#">
test line break before 
open paranthesis < is not working fine
line breaks after paranthesis
is accepted
</pre>text
Run Code Online (Sandbox Code Playgroud)