如何使用 Perl 验证变量值是否包含字符并以数字结尾

How to verify if a variable value contains a character and ends with a number using Perl

我正在尝试检查一个变量是否包含一个字符“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";

如果变量 C 排在第 4 位并以数字结尾,我想放置一个正则表达式来打印一些消息。因此,对于 str1、str2、str3 -> 它应该打印“匹配项”。我正在尝试下面的正则表达式,但是 none 它们都在工作,你能帮助纠正它吗?

my $str1 = "1.0.99.10C9";

if ( $str1 =~ /\D+\d+$/ ) {
   print "Candy match1\n";
}
if ( $str1 =~ /\D+C\d+$/ ) {
   print "Candy match2\n";
}

if ($str1 =~ /\D+"C"+\d+$/) {
print "candy match3";
}

if ($str1 =~ /\D+[Cc]+\d+$/) {
print "candy match4";
}

if ($str1 =~ /\D+\C\d+$/) {
print "candy match5";
}
if ($str1 =~ /C[^.]*\d$/)
  • C 匹配字母 C.
  • [^.]* 匹配任意数量的不是 . 的字符。这样可以确保匹配不会跨越版本号的多个字段,它只会匹配最后一个字段。
  • \d 匹配一个数字。
  • $ 匹配字符串的结尾。所以数字必须在最后。

我发现使用 https://www.regextester.com/109925 测试和分析我的正则表达式字符串真的很有帮助。

让我知道这个正则表达式是否适合你:

((.*\.){3}(.*C\d{1}))

按照您的格式,此正则表达式假设 3 . 之间有字符,然后在第三个 . 之后检查字符串的其余部分是否包含 C.

编辑:

如果您想确保字符串以数字结尾,并且不想用它来检查更长的字符串包含公式,请使用:

^((.*\.){3}(.*C\d{1}))$

让我们看看正则表达式应该是什么样子:

start{digit}.{digit}.{2-3 digits}.{2-3 digits}C{1-2 digits}end

  • 非常非常严格 qr/^1\.0\.9{2,3}\.101?C\d+\z/ - 必须以 1.0.99[9]?.
  • 开头
  • 非常严格 qr/^1\.[=17=].\d{2,3}\.\d{2,3}C\d{1,2}\z/ - 必须以 1.0.
  • 开头
  • 严格qr/^\d\.\d\.\d{2,3}\.\d{2,3}C\d{1,2}\z/
  • 轻松qr/^\d\.\d\.\d+\.\d+C\d+\z/
  • 很放松qr/\.\d+C\d+\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+C\d+\z/;
my $re   = qr/^\d\.\d\.\d{2,3}\.\d{2,3}C\d+\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