0

文字列のパターンに一致する次のルールがあります。

英数字 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

4 に答える 4

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]?

于 2013-08-08T06:57:40.097 に答える
2

これを試して:

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

それはあなたが求めたことを正確にやっています!!!

于 2013-08-08T07:05:30.270 に答える
1

perl (および他のいくつかの言語) では、英数字、数字、およびそのようなもののいくつかの優れたショートカットがあります。

例えば:

\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/)
于 2013-08-08T06:59:21.217 に答える
0
if ($query =~ m/[0-9A-z]{2}[A-z]?\s*[0-9]{1,4}$/)

この上記のコードも機能します。

于 2013-08-08T09:04:51.640 に答える