首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用正则表达式验证月份输入?

如何使用正则表达式验证月份输入?
EN

Stack Overflow用户
提问于 2010-01-26 15:05:15
回答 9查看 56.9K关注 0票数 20

我正在设置这个示例Perl代码片段,以便在一个日期中验证几个月:

我想要接受的一些场景是:

MM M

代码语言:javascript
运行
复制
#!/usr/bin/perl
use strict;
use warnings;

my $pattern;
my $month = "(0[1-9]|1[012])";
my $day = "(0[1-9]|[12]\d|3[01])";

system("cls");

do {

    print "Enter in a month: ";
    chomp($pattern = <STDIN>);

    # We only want to print if the pattern matches
    print "Pattern matches\n" if ($pattern =~ /$month/);


} while ($pattern ne "Q");

当我运行它时,它正确地过滤了01-12,但当我将正则表达式更改为:

代码语言:javascript
运行
复制
$month = "(0?[1-9]|1[012])";

然后正则表达式允许13、14等...怎么回事?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-01-26 15:13:29

如果您真的喜欢使用正则表达式,则需要将^和$放入,如

"^(0?[1-9]|1[012])$"

它不会匹配13,14....

票数 50
EN

Stack Overflow用户

发布于 2010-01-26 15:07:25

您不应该使用正则表达式来进行数值范围验证。您需要的正则表达式为:

代码语言:javascript
运行
复制
/^(\d+)$/

然后,

代码语言:javascript
运行
复制
if ($1 >= 1 && $1 <= 12) {
    # valid month
}

这比任何用于验证数值范围的正则表达式都更容易阅读。

另外,Perl通过在目标中搜索匹配的表达式来计算正则表达式。所以:

代码语言:javascript
运行
复制
/(0[1-9]|1[012])/

搜索后跟1到9的0,或后跟0、1或2的1。这将匹配"202“等许多其他数字。另一方面:

代码语言:javascript
运行
复制
/(0?[1-9]|1[012])/

搜索可选的0 1到9,或者1后跟0、1或2。因此,"13“在这里匹配,因为它包含1,与正则表达式的前半部分匹配。要使您的正则表达式按您期望的方式工作,

代码语言:javascript
运行
复制
/^(0?[1-9]|1[012])$/

^$分别将搜索定位到字符串的开头和结尾。

票数 20
EN

Stack Overflow用户

发布于 2010-01-26 15:14:14

给你提示-月份数字"120“也与你的版本匹配:-)

更改:

代码语言:javascript
运行
复制
my $month = "(0[1-9]|1[012])";

代码语言:javascript
运行
复制
my $month = /^(0[1-9]|1[012])$/;

然后玩得更多

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2137929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档