如何在perl正则表达式匹配之前和之后获取一定数量的字符?

时间:2013-07-03 18:27:26

标签: regex perl

我正在制作符合html代码中最佳匹配条件的正则表达式。我在迭代过程中这样做,以减少匹配以排除我不想要的东西。因此,我制作了一个正则表达式,运行它,并吐出数据,然后我查看,看看我的匹配是如何运作的。例如,如果我正在寻找术语“tema”(提供标准的行业协会的名称),我可能会注意到它也匹配“sitemap”并以某种方式改变我的正则表达式以排除不需要的项目。

为了使这更容易,我想打印出我的匹配以及一些上下文,比如比赛前后的20个字符,而不是整行,以便更容易扫描结果。事实证明,这很难以简单的方式实现。

例如,我认为这样可行:

$line =~ /(.{,20}tema.{,20})/i;

也就是说,我希望在关键字之前和之后匹配最多20个,并将其包含在我打印出来的“上下文”中进行扫描。

但事实并非如此。我在这里错过了什么吗?如果{,20}最多匹配20个字符,那么为什么不会。{,20}匹配任何'。'的20个字符。会匹配吗?

抓我的头。

2 个答案:

答案 0 :(得分:1)

语法:

  • atom{n}(完全 n
  • atom{n,} n 或更多)
  • atom{n,m} n 或更多,但不超过 m

所以,

say $1 if $line =~ /(.{0,20}tema.{0,20})/i;

或者,如果您使用/g并且可能会出现重叠匹配:

say "$1$2$3" while $line =~ /(.{0,20})\K(tema)(?=(.{0,20}))/ig;

a{,20}“最多不匹配20个a个字符。”)

答案 1 :(得分:0)

如何使用m/^(.*)tema(.*)$/进行搜索,然后使用substr或类似内容获取$1的最后一个字符,以及$2中的第一个字符。