如何使正则表达式接受带点

时间:2015-04-25 07:58:10

标签: regex perl

我目前正在调试Perl脚本并遇到一些错误,这些错误将在以下部分中介绍:

在脚本中,我将此-td变量设计为接受类似1n, 5n, 0.3n, 0.8n的字符串

但是当我尝试使用上述列表中的最后两个时,脚本无法按预期工作,只有在我只使用列表中的前两个时才能正常工作。

为了给你一个概述,我已经编写了脚本的一些部分,然后在代码之后,我将表明我的担忧:

if (scalar(@ARGV) < 1){ &get_usage() };
# Getoptions Setup ##
GetOptions (
  'h|help'          => \$help,
  'v|version'       => \$version,
  'i|input=s'       => \$input,
  'o|output=s'      => \$output,

   ...  # more options here

  'td=s'          => \$td_val, # this is the line in question
  'val=s'         => \$v_var,

   ...  # more options here

) or die get_usage();  # this will only call usage of script or help

   ...  # more codes here

get_input_arg();   # this function will validate the entries user had inputted

#assigning to a placeholder value for creating a new file
$td_char="\ttd=$td_val" if $td_val;
$td_char=" " if !$td_val;

... # fast forward ...

sub get_input_arg{

...
# here you go, there is wrong in the following regex to accept values such as 0.8n 
unless (($td_val=~/^\d+(m|u|n|p)s$/)||($td_val=~/^\d+(m|u|n|p|s)$/)||($td_val=~/^\d+$/)){#
print "\n-td error!\nEnter the required value!\n";
get_usage();

... # more functions here ...

}

解释:

  1. 在控制台上,用户将输入-td 5n
  2. 5n将被分配到td_valtd_char并稍后用于打印
  3. 5n将由get_input_arg()函数验证,该函数将传递到正则表达式unless行。
  4. 对于5n输入,脚本按预期工作,但是当我们使用-td 0.8n时,在验证它之后,它将在控制台上的unless行之后打印错误消息

    我知道正则表达式无法匹配使用0.8n作为td输入,但我不知道如何解决它。提前谢谢!

1 个答案:

答案 0 :(得分:-1)

您可以使用

unless (($td_val=~/^\d+(\.\d+)?[munp]s$/)||($td_val=~/^\d+(\.\d+)?[munps]$/)||($td_val=~/^\d+(\.\d+)?$/))

说明:

你的正则表达式\d+只匹配整数..所以用\d+(\.\d+)?替换它(整数部分后跟可选的小数部分)

请参阅DEMO