我想使用正则表达式检查字符串以确保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之后来。
答案 0 :(得分:2)
假设您要匹配任何包含两位数的字符串,其中第一位数字小于第二位数字:
有一个名为“推迟正则表达式”的晦涩功能。我们可以使用
在正则表达式中包含代码(??{CODE})
并将该代码的值插入到正则表达式中。
特殊的动词 (*FAIL)
确保匹配失败(实际上只是当前分支)。我们可以将它组合成以下单行:
perl -ne'print /(\d)(\d)(??{$1<$2 ? "" : "(*FAIL)"})/ ? "yes\n" :"no\n"'
如果当前行包含两位数字,其中第一位数字小于第二位数字,则打印yes
;如果不是这种情况,则打印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)可能更好。但仍然可以只使用正则表达式。
以下是一种确保5
后面没有4
的方法:
/^(?:[^5]+|5(?=[^4]|$))*$/
这读作:字符串由任何数字(零个或多个)不五个字符组成,或者五个字符后跟一个不是四个字符的字符或者五是字符串的结尾。
这个正则表达式也是可能的:
/^(?:[^45]+|45)*$/
它允许字符串中的任何字符不是4
或5
,或者是序列45
。也就是说,不允许单4
个或5
。
答案 1 :(得分:0)
你只需匹配所有5和搜索失败,其中前面不是4:
if( $str =~ /(?<!4)5/ ) {
#Fail
}