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