Perl:用于匹配和替换单词和可选句号的正则表达式



我试图将一些文件名大写,并对其应用一些例外。我有一系列的替换,其中一个是

s/b(vs|etc)[.]?b/L$1./gir

我想匹配任何出现的"vs"或";Vs"或"vs !"或"VS !"或"等!"或";Etc"等等......如果源字符串已经有一个句号(例如。&;Vs.&;)那么我就不想加一个,否则我就想加一个。字符串的结果部分也需要小写,以便唯一有效的输出是vs.etc.

这可能只是一个微不足道的变化,但我就是找不到它。谁能告诉我这个正则表达式是怎么组装的?

请记住,单词边界的含义与上下文有关。

在这里,您需要将可选.之前的单词边界移动为.b(即,当etc之后有.时)只有在.之后有字母,数字或_时才会匹配。

所以你可以用

s/b(vs|etc)b.?/L$1./gir

查看Perl在线演示:

#!/usr/bin/perl
use feature 'say';
use strict;
use warnings;
my $str = "vs or Vs or vs. or VS. or etc avs and metch";
say $str =~ s/b(vs|etc)b.?/L$1./gir;
# => vs. or vs. or vs. or vs. or etc. avs and metch

最新更新