正则表达式替换中的变量插值

时间:2018-09-19 20:16:30

标签: regex perl

我正在研究Perl程序以解析XML并在数据上进行正则表达式字符串替换。我读了几篇有关使用Perl进行字符串替换的文章。

在用目标字符串替换源值时,它们正在使用一些$变量($1$2$3$4等)。模式在进行字符串比较时如何存储值?

请找到所需的示例代码。

示例XML文件

  <Para>
    <Hyperlink Display="hide" Protocol="http" URN="https://www.basicurl.org/oid/10.1161/RIA.0000abc">
      AHA
    </Hyperlink>
    (Free)
  </Para>
  <Para>
    <Hyperlink Display="hide" Protocol="http" URN="https://www.abcd.com">
      Background: some text with multiple lines
    </Hyperlink>
    (i have three lines of code)
  </Para>
</Comment>

目标成就

$Str =~ s|<Hyperlink\b[^\>]*?>([^\xFF]*?)([12][890][0-9]{2})([^\xFF]*?)</Hyperlink>|<Emph Emph.Type="Italic">$1</Emph>$2$3|g;

据我了解,我们正在选择超链接数据并替换$str中的值。 /g代表全局替换。上面输入文件中的$1$2$3的值是什么?

1 个答案:

答案 0 :(得分:2)

使用正则表达式模式时,有一个称为捕获组的东西,它们由模式中的括号(...)分隔。它们按其开头括号在模式中出现的顺序编号,并用于将字符串的一部分保存到内置Perl变量$1$2等中。

例如/(Hello?)(goo?d)/hello中捕获hell$1,在good中捕获god$2


关于您的示例

$Str =~ s|<Hyperlink\b[^\>]*?>([^\xFF]*?)([12][890][0-9]{2})([^\xFF]*?)</Hyperlink>|<Emph Emph.Type="Italic">$1</Emph>$2$3|g;
  • ([^\xFF]*?)将捕获从0到无限次不等于FF(十六进制)的任何字符。它可以捕获0个或更多不等于"\xFF"

  • 的字符
  • ([12][890][0-9]{2})将捕获数字12,然后捕获数字8 90,然后捕获数字从09的两位数。

  • ([^\xFF]*?)与第一个捕获组相同