带有非捕获组的 Perl 替换正则表达式

Perl Substitution regexp with non capturing group

我在 $text 中存储了以下内容:

<h1>Bonjour tout le monde (diverses langues) !</h1>

<h2>Anglais</h2>

Hello World!
<quote>Every first computer program starts out "Hello World!".</quote>

<h2>Espagnol</h2>

¡Hola mundo!

<image=http://example.com/IMG/jpg/person.jpg>

我想插入一些

<p>...</p>

段落周围的标签尚未包含在标签中。

我试过了

$text =~ s/(?:<.*>)*(.*)/<p><\/p>/g;

但是替换并没有保留我的非捕获组。它会产生这个:

<p>

</p><p>

Hello World!
</p><p>

</p><p>

¡Hola mundo!

</p><p>
</p><p></p>

有什么想法吗?

谢谢。

或许尝试使用一种模式,该模式只查找不以 < > 开头或结尾的行。还建议包括 \n,因为您不希望每一行只包含一个换行符来获得 <p></p> 标签:

$text =~ s/(^[^<\n]+.+|.+[^\/\n>]+$)/<p><\/p>/gm;

示例:

http://ideone.com/p55Ino

s/// 替换它匹配的内容。

您可以使用

$text =~ s/((?:<.*>)*)(.*)/<p><\/p>/g;

前瞻或后瞻匹配的文本不被视为匹配的一部分。在遇到 \K 之前,文本也不匹配。

$text =~ s/(?:<.*>)*\K(.*)/<p><\/p>/g;

第二种解决方案需要 Perl 5.10+。