当字符串包含空格时,正则表达式不匹配

时间:2013-08-08 06:53:13

标签: regex perl

我有以下规则来匹配字符串中的模式。

  

2个字母数字字符,后跟0或1个字母,后跟0   或更多空格,后跟1到4位

我尝试了一个正则表达式,但我仍然错过了几个案例。

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
my @quer = ('a1q 1234', '11 asdd', 'as 11aa', 'asdasdasd', 'asdd as', 'asdasd asdassdasd', '11 1231', '11 a 12345', '345 1 1231', '12a 123', 'ab 12', 'ab12');
foreach my $query (@quer) {
    if ($query =~ m/\b[a-zA-Z0-9]{2}[a-zA-Z]{0,1}\s*\b[0-9]{1,4}\b/) {
        print "Matched : $query\n";
    } else {
        print "Doesn't match : $query\n";
    }
}

我的代码匹配ab 12但不匹配ab12,但根据规则,它应匹配两者。

4 个答案:

答案 0 :(得分:3)

你的中间有一个单词边界,这正在搞你的正则表达式。删除它:

if ($query =~ m/\b[a-zA-Z0-9]{2}[a-zA-Z]{0,1}\s*\b[0-9]{1,4}\b/)
                                                 ^
                                             remove this

应该是:

if ($query =~ m/\b[a-zA-Z0-9]{2}[a-zA-Z]?\s*[0-9]{1,4}\b/)

注意,[a-zA-Z]{0,1}[a-zA-Z]?

相同

答案 1 :(得分:2)

试试这个:

if ($query =~ m/\b[a-zA-Z0-9]{2}[a-zA-Z]{0,1}\s*[0-9]{1,4}\b/) {

这正是你所要求的!!!

答案 2 :(得分:1)

在perl(和其他一些语言)中,你有一些很好的字母数字,数字和类似的快捷方式。

e.g:

\w  Match "word" character (alphanumeric plus "_")
\W  Match non-word character
\s  Match whitespace character
\S  Match non-whitespace character
\d  Match digit character
\D  Match non-digit character

但你的问题是中间的单词边界(\b

试试这个:

if ($query =~ m/\b\w{2}\w?\s*\d{1,4}\b/)

答案 3 :(得分:0)

if ($query =~ m/[0-9A-z]{2}[A-z]?\s*[0-9]{1,4}$/)

以上代码也可以使用。