0

正規表現を使用して文字列をチェックし、4と5が正しいことを確認したいと思います。私はこれを行うことでこれができると思いました

'$string =~ m/.45./'

私はどこかで間違っていると思います。私はPerlにとても慣れていません。正直に言って、それを配列に入れて検索し、その方法を見つけたいと思いますが、正規表現を使用してそれを行うもっと簡単な方法があると思います。

print "input please:\n";
$input = <STDIN>;
chop($input);
if ($input =~ m/45/ and $input =~ m/5./) {
    print "works";
}
else {
    print "nata";
}

編集:追加情報私は4と5を順番に並べたいのですが、5が前に来る場合は、322195458900023が数字であり、545が問題である場合5は常に4の直後に来る必要があります。

4

2 に答える 2

2

最初の桁が2番目の桁よりも小さい2桁を含む任意の文字列に一致させると仮定します。

「延期された正規表現」と呼ばれるあいまいな機能があります。正規表現内にコードを含めることができます

(??{CODE})

そのコードの値は正規表現に補間されます。

特別な動詞 (*FAIL)は、一致が失敗することを確認します(実際には現在のブランチのみ)。これを次のワンライナーに組み合わせることができます。

perl -ne'print /(\d)(\d)(??{$1<$2 ? "" : "(*FAIL)"})/ ? "yes\n" :"no\n"'

yes現在の行に2桁が含まれていて、最初の桁が2番目の桁よりも小さい場合と、そうでない場合に印刷されnoます。

正規表現の説明:

m{
   (\d)   # match a number, save it in $1
   (\d)   # match another number, save it in $2
   (??{   # start postponed regex
      $1 < $2      # if $1 is smaller than $2
      ? ""         # then return the empty string (i.e. succeed)
      : "(*FAIL)"  # else return the *FAIL verb
   })     # close postponed regex
}x;       # /x modifier so I could use spaces and comments

ただし、これは少し高度でマゾヒスティックです。配列を使用すると、(1)はるかに理解しやすくなり、(2)とにかくおそらくより良くなります。ただし、正規表現のみを使用することは可能です。


編集

これは、noの後に:5が続くことを確認する方法です。4

/^(?:[^5]+|5(?=[^4]|$))*$/

これは次のようになります。文字列は、5以外の任意の数(0個以上)の文字で構成されますまたは、5の後に、4以外の文字または5のいずれかが続きます。

この正規表現も可能性があります:

/^(?:[^45]+|45)*$/

4文字列内で、または5、またはシーケンスではない任意の文字を許可します45。つまり、単一4のまた5はは許可されていません。

于 2012-09-28T02:46:31.607 に答える
0

5つすべてに一致する必要があり、検索は失敗します。先行するのは4ではありません。

if( $str =~ /(?<!4)5/ ) {
    #Fail
}
于 2012-09-30T05:49:33.563 に答える