最初の桁が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
はは許可されていません。