Perl:Substituion Regex中的字符串重复运算符

时间:2016-02-13 22:25:35

标签: regex perl substitution

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

我试图在非常基本的HTML上快速进行单行操作而不使用模块。基本上,我希望根据HTML标记中的标题编号,将包含开放<h*>和关闭</h*> HTML标记的行转换为WIKI标记。所以......

___Original DATA___

  • <h1> This is a header one</h1>

  • <h2> This is a header two</h2>

  • <h3> This is a header three</h3>

___Wanted DATA___

  • = This is a header one =

  • == This is a header two ==

  • === This is a header three ===

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

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

3 个答案:

答案 0 :(得分:2)

运算符不以字符串形式进行插值。您需要/e开关将替换解释为代码,而不仅仅是字符串:

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

您还可以使用其他分隔符代替/,以避免在</h中反斜杠。

不需要

/s,因为它会更改正则表达式中不会出现的.行为。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

此版本使用{}分隔符来避免escape-itis,a / i和反向引用,例如

X = [(height);(width);(a1)];

无法匹配。

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