Regex 如何在perl正则表达式匹配前后获取一定数量的字符?
我正在制作一些正则表达式,这些正则表达式与html代码中的某些术语最匹配。我在一个迭代过程中这样做,以减少匹配,排除我不想要的东西。因此,我制作了一个正则表达式,运行它,并吐出数据,然后查看我的匹配是否正常。例如,如果我正在寻找术语“tema”(提供标准的行业协会的名称),我可能会注意到它也与“sitemap”匹配,并以某种方式修改我的正则表达式以排除不需要的项目 为了使这更容易,我想打印匹配和一些上下文,比如匹配前后的20个字符,而不是整行,以便更容易地扫描结果。事实证明,用简单的方式很难做到这一点 例如,我认为这是可行的:Regex 如何在perl正则表达式匹配前后获取一定数量的字符?,regex,perl,Regex,Perl,我正在制作一些正则表达式,这些正则表达式与html代码中的某些术语最匹配。我在一个迭代过程中这样做,以减少匹配,排除我不想要的东西。因此,我制作了一个正则表达式,运行它,并吐出数据,然后查看我的匹配是否正常。例如,如果我正在寻找术语“tema”(提供标准的行业协会的名称),我可能会注意到它也与“sitemap”匹配,并以某种方式修改我的正则表达式以排除不需要的项目 为了使这更容易,我想打印匹配和一些上下文,比如匹配前后的20个字符,而不是整行,以便更容易地扫描结果。事实证明,用简单的方式很难做到
$line=~/(.{,20}tema.{,20})/i代码>
也就是说,我想匹配多达20个关键字前后的任何内容,并将其包含在我打印出来供扫描的“上下文”中
但事实并非如此。我是不是遗漏了什么?如果一个{,20}将匹配多达20个“a”字符,为什么。{,20}不匹配“.”将匹配的任何字符中的20个
搔搔头。用m/^(.*)tema(.*)$/
搜索,然后使用substr
或类似方法获取$1
的最后一个字符和$2
的第一个字符语法:
- 原子{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;