以下正则表达式有何作用?

时间:2014-03-24 12:25:58

标签: regex perl

foreach(@first)
{
    $first[$r] =~s/<.*>(.*)<.*>/$1/;

    $first[$r]=$1;

    $r++;
}

正则表达式在第3行上做了什么?

2 个答案:

答案 0 :(得分:4)

子代s/<.*>(.*)<.*>/$1/看起来像是一个从字符串中删除周围HTML标记的愚蠢尝试。例如,给定输入

"<p>foo bar <em>baz</em> qux</p>"

我们会得到输出" qux"

  • <.*>匹配小于号,尽可能多的字符,然后是大于号。
  • (.*)匹配尽可能多的字符,并将匹配记为$1
  • <.*>匹配小于号,尽可能多的字符,然后是大于号。

然后,整个匹配被捕获组1的内容替换。


但是,该代码看起来像是由不是经验丰富的程序员的人编写的,并且无论如何都不太了解Perl。假设在循环之前$r = 0,它将等同于:

for (@first) {
    /<.*>(.*)<.*>/;
    $_ = $1;
}

@first = map { /<.*>(.*)<.*>/; $1 } @first;

答案 1 :(得分:1)

匹配以下内容:

  • 字面意思<
  • 0到无限次.*
  • 之间的任何字符
  • 字面意思>
  • 使用反向引用1 (
  • 开始捕获组
  • 0到无限次.*
  • 之间的任何字符
  • 使用反向引用1 )
  • 关闭捕获组
  • 字面意思<
  • 0到无限次.*
  • 之间的任何字符
  • 字面意思>

替换为:

$1具有反向引用1的捕获组。


演示:

http://regex101.com/r/iI4wB9