Perl:替换正则表达式中的字符串重复运算符
Perl: String Repetition Operator in Substituion Regex
是否有一种简单的方法可以在替换正则表达式期间使用 Perl 的重复运算符 x
?
我正在尝试在不使用模块的情况下快速 one-liner 非常基础的 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 ===
一切都适用于正则表达式本身,将原始 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;
是否有一种简单的方法可以在替换正则表达式期间使用 Perl 的重复运算符 x
?
我正在尝试在不使用模块的情况下快速 one-liner 非常基础的 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 ===
一切都适用于正则表达式本身,将原始 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;