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

Regex 如何在perl正则表达式匹配前后获取一定数量的字符?,regex,perl,Regex,Perl,我正在制作一些正则表达式,这些正则表达式与html代码中的某些术语最匹配。我在一个迭代过程中这样做,以减少匹配,排除我不想要的东西。因此,我制作了一个正则表达式,运行它,并吐出数据,然后查看我的匹配是否正常。例如,如果我正在寻找术语“tema”(提供标准的行业协会的名称),我可能会注意到它也与“sitemap”匹配,并以某种方式修改我的正则表达式以排除不需要的项目 为了使这更容易,我想打印匹配和一些上下文,比如匹配前后的20个字符,而不是整行,以便更容易地扫描结果。事实证明,用简单的方式很难做到

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

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

例如,我认为这是可行的:

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

也就是说,我想匹配多达20个关键字前后的任何内容,并将其包含在我打印出来供扫描的“上下文”中

但事实并非如此。我是不是遗漏了什么?如果一个{,20}将匹配多达20个“a”字符,为什么。{,20}不匹配“.”将匹配的任何字符中的20个


搔搔头。

m/^(.*)tema(.*)$/
搜索,然后使用
substr
或类似方法获取
$1
的最后一个字符和
$2
的第一个字符语法:

  • 原子{n}
(正是n)
  • 原子{n,}(n或更多)
  • 原子{n,m}
    (n个或更多,但不超过m)
  • 所以

    或者,如果您使用的是
    /g
    ,并且可能会得到重叠匹配:

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

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

    你说的
    它不匹配是什么意思?你的角色少了吗?没有角色?没有对手?错误?请注意,
    不能匹配换行符。如果您想在这些任意字符中包含换行符,请使用
    s
    修饰符。我认为您的代码示例不正确。它不会返回任何内容。没有匹配。哎哟,是的,剪切/粘贴错误很糟糕,我在上面修复了它。这就是我现在正在做的事情(但是在before/match/after字符串中使用了$`、$&和$'),但是它很混乱。我希望能在正则表达式中完成这一切,所以我只有一行而不是8行。非常感谢。我想在{0,20}中去掉零就是了。我在perl正则表达式教程的某个地方发现了这种语法,但显然是错误的。@Peter C,可能是另一种语言的正则表达式。
    say "$1$2$3" while $line =~ /(.{0,20})\K(tema)(?=(.{0,20}))/ig;