如何只匹配几个号码?

问题描述 投票:0回答:1

目前,我有一个问题,只匹配几个数字。

比如说

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+/{

}
perl
1个回答
3
投票
/(?:^|\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] 代替)。)


1
投票

使用替代方法:空格或字符串的开头。

$input =~ /(?:^|\s)(\d{4})(?:$|\s)/

同时注意 \d 匹配其他书写系统的数字,如"೬"。使用 [0-9]/a 修饰符,只匹配ascii数字。


0
投票

我不喜欢丑陋的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;
}
© www.soinside.com 2019 - 2024. All rights reserved.