Regex 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

正在查找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个字母(用*)

我希望它能避免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:不用谢!我已经添加了数字部分的解释。