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

Perl: Regex for matching and replacing word and optional full stop

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

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

有了这个,我想匹配任何出现的“vs”或“Vs”或“vs”。或“VS”。或“等”或“等等”等等。如果源字符串已经有一个句号(例如“Vs.”),那么我不想添加一个,否则我确实想添加一个。字符串的结果部分也需要小写,因此唯一有效的输出是 vs.etc..

这可能只是一个微不足道的改动,但我就是找不到。有人可以让我了解 assemble 正则表达式的思考过程吗?

记住 word boundary meaning is context-dependent.

在这里,你需要移动可选.之前的单词边界,因为\.\b(即当.之后有一个.时,比如etc)只会如果在 ..

之后有字母、数字或 _ 则匹配

所以,您可以使用

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

参见 Perl demo online:

#!/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./gir;
# => vs. or vs. or vs. or vs. or etc. avs and metch