目前,我有一个问题,只匹配几个数字。
比如说
my $input1 = "1234 abc test"; - > expect - match and return 1234
my $input2 = " 1234 abc test"; - > expect - match and return 1234
my $input3 = "abc test 1234"; - > expect - match and return 1234
my $input4 = "a1234 test"; not match
my $input5 = "1234- abc test"; not match
my $input6 = "abc 12345 test"; not match
以上6个例子中,只有输入1,输入2,输入3需要返回。1234
. 其他人将返回 not matched
. 如何编写这样的正则表达式?
我试着这样做,但是对于input1和input3是不行的。
if $input =~ /\s+(\d{4,4})\s+/{
}
/(?:^|\s)(\d{4})(?:\z|\s)/a
或
/(?<!\S)(\d{4})(?!\S)/a # Not proceeded by a non-space and not followed by a non-space.
(\d
一般来说,它可以匹配630个不同的代码点。该 /a
导致它只与 [0-9]
代替)。)
使用替代方法:空格或字符串的开头。
$input =~ /(?:^|\s)(\d{4})(?:$|\s)/
同时注意 \d
匹配其他书写系统的数字,如"೬"。使用 [0-9]
或 /a
修饰符,只匹配ascii数字。
我不喜欢丑陋的regex,如果它能被拆分来简化代码的话......。 这个Perl可以工作,它只用一个通道来抓取任何值,并在第二个通道中双重检查格式......。
#!/usr/bin/env perl
$input[1] = "1234 abc test"; # - > expect - match and return 1234
$input[2] = " 1234 abc test"; # - > expect - match and return 1234
$input[3] = "abc test 1234"; # - > expect - match and return 1234
$input[4] = "a1234 test"; # not match
$input[5] = "1234- abc test"; # not match
$input[6] = "abc 12345 test"; # not match
for $input (@input) {
# $input = $input[$i];
next if $input !~ /(.?\d{4}.?)/;
$val = $1;
next if $val !~ /^\s?(\d{4})\s?$/;
$val = $1;
printf "%s\n", $val;
}