我正在尝试检查变量是否包含字符"C"并以数字结尾,在次要版本中。我有:
my $str1 = "1.0.99.10C9";
my $str2 = "1.0.99.10C10";
my $str3 = "1.0.999.101C9";
my $str4 = "1.0.995.511";
my $str5 = "1.0.995.AC";
如果变量在第 4 位有 C 并以数字结尾,我想放一个正则表达式来打印一些消息。 因此,对于 str1,str2,str3 ->,它应该打印"匹配"。我正在尝试在正则表达式下面,但它们都不起作用,你能帮忙纠正它吗?
my $str1 = "1.0.99.10C9";
if ( $str1 =~ /D+d+$/ ) {
print "Candy match1n";
}
if ( $str1 =~ /D+Cd+$/ ) {
print "Candy match2n";
}
if ($str1 =~ /D+"C"+d+$/) {
print "candy match3";
}
if ($str1 =~ /D+[Cc]+d+$/) {
print "candy match4";
}
if ($str1 =~ /D+\Cd+$/) {
print "candy match5";
}
if ($str1 =~ /C[^.]*d$/)
C
与字母C
匹配。[^.]*
匹配未.
的任意数量的字符。这可确保匹配不会跨越版本号的多个字段,它只会匹配最后一个字段。d
匹配一个数字。$
匹配字符串的末尾。所以数字必须在最后。
我发现使用 https://www.regextester.com/109925 来测试和分析我的正则表达式字符串真的很有帮助。
让我知道这个正则表达式是否适合您:
((.*.){3}(.*Cd{1}))
按照您的格式,此正则表达式假设 3 个.
,中间有字符,然后在第三个.
之后,它会检查字符串的其余部分是否包含 C。
编辑:
如果要确保字符串以数字结尾,并且不想使用它来检查包含公式的较长字符串,请使用:
^((.*.){3}(.*Cd{1}))$
让我们看看正则表达式应该是什么样子:
start{digit}.
{digit}.
{2-3 digits}.
{2-3 digits}C{1-2 digits}end
- 非常严格的
qr/^1.0.9{2,3}.101?Cd+z/
- 必须从1.0.99[9]?.
开始 - 非常严格的
qr/^1. .d{2,3}.d{2,3}Cd{1,2}z/
- 必须从1.0.
开始 - 严格的
qr/^d.d.d{2,3}.d{2,3}Cd{1,2}z/
- 轻松
qr/^d.d.d+.d+Cd+z/
- 非常轻松的
qr/.d+Cd+z/
use strict;
use warnings;
use feature 'say';
my @data = qw/1.0.99.10C9 1.0.99.10C10 1.0.999.101C9 1.0.995.511 1.0.995.AC/;
#my $re = qr/^d.d.d+.d+Cd+z/;
my $re = qr/^d.d.d{2,3}.d{2,3}Cd+z/;
say '--- Input Data ---';
say for @data;
say '--- Matching -----';
for( @data ) {
say 'match ' . $_ if /$re/;
}
输出
--- Input Data ---
1.0.99.10C9
1.0.99.10C10
1.0.999.101C9
1.0.995.511
1.0.995.AC
--- Matching -----
match 1.0.99.10C9
match 1.0.99.10C10
match 1.0.999.101C9