Perl:替换正则表达式中的字符串重复运算符

Perl: String Repetition Operator in Substituion Regex

是否有一种简单的方法可以在替换正则表达式期间使用 Perl 的重复运算符 x

我正在尝试在不使用模块的情况下快速 one-liner 非常基础的 HTML。本质上,我想根据 HTML 标记中的标题编号将带有开始 <h*> 和结束 </h*> HTML 标记的行转换为 WIKI 标记。所以...

___Original DATA___

___Wanted DATA___

一切都适用于正则表达式本身,将原始 header 标记中所需的数字捕获到 </code> 变量中。在替换部分,有没有一种方法可以使用该变量来创建所需数量的 <code>= 符号(例如,"=" x )?

perl -0777 -pe 's/<h(\d)>([^<]*)<\/h\d>/"="x "="x/gs',但是命令的后半部分("="x "="x)没有给我想要的输出。

运算符不插入字符串中。您需要 /e 开关将替换解释为代码,而不仅仅是字符串:

s/<h(\d)>([^<]*)<\/h\d>/"=" x  .  . "=" x /ge

您也可以使用不同的分隔符代替 /,以避免在 </h 中使用反斜杠。

/s 不是必需的,因为它改变了 . 的行为,这在正则表达式中没有发生。

这就是 s///e regex modifier 的用途:

s/<h(\d)>([^<]*)<\/h\d>/("=" x ) .. ("=" x )/gse

此版本使用 {} 分隔符来避免转义,/i 和反向引用,例如

<h1>.....</h3> 

不匹配。

s{<h(\d)>([^<]*)</h\g1>}{"=" x  . "  " . "=" x }gei;