使用perl正则表达式我想确保一个数字按顺序排列

时间:2012-09-28 02:27:26

标签: regex perl

我想使用正则表达式检查字符串以确保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之后来。

2 个答案:

答案 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)*$/

它允许字符串中的任何字符不是45,或者是序列45。也就是说,不允许单4个或5

答案 1 :(得分:0)

你只需匹配所有5和搜索失败,其中前面不是4:

if( $str =~ /(?<!4)5/ ) {
    #Fail
}