Regex MMDDYYFFFMLLLL的正则表达式
正在查找MMDDYYFFFMLLLL的正则表达式Regex MMDDYYFFFMLLLL的正则表达式,regex,Regex,正在查找MMDDYYFFFMLLLL的正则表达式 MM - 01-12 (month) DD - 01-31 (Day) YY - 00-99 (Year) FFF - a-z A-Z and * (ie: JOH or LI*) M - a-z A-Z and * (ie: M or *) LLLL - a-z A-Z and * (ie: SMIT or LI**) 基本上,FFF是一个人名字的前3个字母(用*填充) 基本上,LLLL是一个人姓氏的前4个字母(用*) 我希望它能避免0
MM - 01-12 (month)
DD - 01-31 (Day)
YY - 00-99 (Year)
FFF - a-z A-Z and * (ie: JOH or LI*)
M - a-z A-Z and * (ie: M or *)
LLLL - a-z A-Z and * (ie: SMIT or LI**)
基本上,FFF
是一个人名字的前3个字母(用*填充)基本上,
LLLL
是一个人姓氏的前4个字母(用*)我希望它能避免093104,因为9月份只有30天
谢谢非常简单,真的:
^(?!023)(?!0229.[13579])(?!0229[02468][26])(?!0229[13579][048])(?!(0[469]|11)31)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])([0-9]{2})(?!.?[*][^*])([a-zA-Z*]{3})[a-zA-Z*](?!.{0,2}[*][^*])([a-zA-Z*]{4})$
(已测试。)
您询问了数字部分;这里有一个解释:我相信(0[1-9]|1[012])
(两位数,01
到12
),(0[1-9]|[12][0-9]|[3[01])
(两位数,01
到31
),和([0-9]{2})到(任何两位数)都足够简单。这与MMDDYY
完美匹配,但需要注意的是,它只能强制执行DD
介于1和31之间;它不知道有几个月比这短。为了实施这一限制,我们在(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])([0-9]{2})
前面加入了一系列(?!…)
表达式,“消极前瞻断言”;这样的表达式断言,从字符串中的指定位置向前看,…
无法匹配
因此,^(?!023)(?!0229[13579])(?!0229[02468][26])(?!0229[13579][048])(?!(0[469]| 11)31
确保字符串不会以与023
(2月30多岁)、0229[13579]
(奇数年2月29日),0229[02468][26]匹配的子字符串开头(即使不是闰年的偶数十年中的偶数年的2月29日,如2006年),(?!0229[13579][048])
(即使不是闰年的奇数十年中的偶数年的2月29日,如2014年),或(0[469]| 11)31
(4月、6月、9月或11月30日)。这排除了DD
中介于1和31之间但仍然无效的所有值
请注意,这假设00
指的是2000
年。规则是四的任何倍数都是闰年,除非一百的倍数是四百的倍数,否则不是闰年。因此1900
不是闰年,2100
也不是闰年,但2000
是。上面的正则表达式将00
视为闰年。如果可能,您最好只使用一个简单的正则表达式(从(\d\d)(\d\d)(\d\d)…
)然后使用应用程序代码实现更详细的验证。在正则表达式中完成这一切将使您的代码几乎无法维护。此外,您应该指定您使用的正则表达式语言类型。例如,Java和Grep有很大的不同。要支持Felix的语句,请考虑正则表达式的“逻辑”。这将在JavaScript中使用。你能解释一下这个表达式吗?@user1207485:如果你愿意,我可以,但你确定你真的想使用它吗?我的意思是,如果有人输入093104JOH*SMIT
,你真的想告诉他们“无效输入”吗没有给出任何方法来确定问题是无效日期?我半开玩笑地发布了正则表达式:这是执行您的要求的最简单的正则表达式,正如您所看到的,这是一个非常糟糕的问题(“非常简单”是100%开玩笑)首先让我说声谢谢。我感谢你的帮助。但我只是对正则表达式中的某些点感到好奇。字母部分不太难理解,但数字部分似乎很难理解(我从来没有真正经常使用正则表达式)。@user1207485:不用谢!我已经添加了数字部分的解释。