- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道那里有很多正则表达式线程,但我找不到任何地方。
我有一个适用于 DD/MM/YYYY 格式的正则表达式。在这里:
^((0?[13578]|1[02])[\/.]31[\/.][1-9][0-9]{3})|(([01,1]|0[3-9]|1[1-2])[\/.](29|30)[\/.][1-9][0-9]{3})|((0?[1-9]|1[0-2])[\/.](0?[1-9]|1[0-9]|2[0-8])[\/.][1-9][0-9]{3})|([02,2][\/.]29[\/.](([1-9][0-9](04|08|[2468][048]|[13579][26]))|([2468][0]{3})))$
示例:29/2/2014、31/4/2014...
但是当我尝试使用 YYYY/MM/DD 格式进行验证时,我发现了这个:
^(((19|20)([2468][048]|[13579][26]|0[48])|2000)[\/.]02[\/.]29|((19|20)[0-9]{2}[\/.](0?[469]|11)[\/.](0?[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}[\/.](0?[13578]|1[02])[\/.](0?[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}[\/.]02[\/.](0?[1-9]|1[0-9]|2[0-8])))$
此模式仅适用于 YYYY 从:19xx -> 20xxx。
当我更改它时,我希望它可以很好地与 YYYY 从:1xxx ->9xxx 一起使用。但效果并不好。
我是正则表达式的新手,很难逃脱它。
非常感谢,抱歉我的英语不好。
最佳答案
编辑:我决定在午餐时花几分钟时间清理它并添加“正确”的方法(没有正则表达式)以及一个 jsFiddle。
为了可读性、可维护性和健全性,正确的做法是避免在此处使用正则表达式。编写正则表达式来执行此操作非常困难,而且结果也非常难以阅读。
相反,只需将日期解析为其组成部分,然后像这样验证它们:
/**
* Check whether a given year is a leap year
* @param integer y The integer
* @return boolean True for yes, false for no
*/
function isLeapYear(y) {
return (0 == y % 4 && (0 == y % 400 || 0 != y % 100));
}
/**
* Validate a date in YYYY/MM/DD format (allows YYYY/M/D and periods instead of slashes) without regex.
* @param string str The date to test.
* @return boolean True for valid, false for invalid.
*/
function validateDateWithoutRegex(str) {
// check the format first
if(!/^\d{4}[\/.]\d{1,2}[\/.]\d{1,2}$/.test(str)) {
return false;
}
var parts = str.split(/\D/) // split on non-digits
.map(function(val) { return parseInt(val); }); // convert strings to ints
if(parts[0] < 1000 || parts[0] > 2999) { // invalid year
return false;
}
if(parts[1] > 12 || parts[1] === 0) { // invalid month
return false;
}
if(parts[2] > 31 || parts[2] === 0) { // invalid day
return false;
}
switch(parts[1]) {
case 4:
case 6:
case 9:
case 11:
if(parts[2] > 30) { // invalid day
return false;
}
break;
case 2: // February...
return (parts[2] < 29 || parts[2] == 29 && isLeapYear(parts[0]));
break;
}
return true;
}
// Usage: validateDateWithoutRegex('2014/07/28'); // returns true
但是,只是因为今晚我想做一些正则表达式......你可以使用这个怪物:
/^(?=(?!\d+\D0?2\D29)|(?:\d{2}(?:04|08|[13579][26]|[2468][048])|1[26]00|2000)\D0?2\D29$)([12]\d{3})[\/.]((?:0?[13578]|10|12)[\/.](?:0?[1-9]|[12]\d|3[0-1])|(?:0?[469]|11)[\/.](?:0?[1-9]|[12]\d|30)|0?2[\/.](?:0?[1-9]|1\d|2[0-9]))$/
这甚至可以验证闰年。
Here's an interactive jsFiddle that also runs 50+ unit tests验证此方法与非正则表达式方法的工作方式相同。
可能有用的解释,由 Debuggex 提供:
匹配示例:
不匹配示例:
已经很晚了,我们将不胜感激。
公历与新教改革等历史密切相关。它在创建时引起了极大的争议,并没有被普遍采用。采用它的地方在不同时间以不同方式采用它。结果:哪些日期在公历中有效取决于您所在的位置。 See, e.g., Wikipedia .
从本质上讲,公历于 1582 年问世。从那时起,其采用因国家/地区而异。例如,日历基本上定义为 1582 年的 10 月 5 日至 14 日不存在。许多国家同样跳过日期以移动旧的(Julian)日历日期以匹配公历,但他们并没有全部跳过相同的日子(甚至天数相同);他们跳过哪几天取决于国家/地区以及采用日历的时间。
因此,如果您希望能够验证 1582 年之前(在某些地方甚至是 1923 年)之前的日期,请牢记所有这些。玩得开心!
关于javascript - 尝试验证 YYYY/MM/dd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24989065/
我需要使用正则表达式验证格式为 dd/mm/yyyy 的日期字符串。 此正则表达式验证 dd/mm/yyyy,但不验证 31/02/4500 等无效日期: ^(0?[1-9]|[12][0-9]|3[
我需要检查给定字符串的日期。我得到的字符串不规则,我不想使用 Dateformat 或类似的东西。我试图避免出现多个异常。我需要 dd.MM.yyyy 和 MM.yyyy 和 yyyy 的正则表达式。
我想使用在这里找到的 jQuery 屏蔽输入插件 http://digitalbush.com/projects/masked-input-plugin/格式化日期。 我正在从数据库中提取数据以在页面
我正在尝试以更有效的方式根据当前日期找出当前财政年度(FY - 3 月至 4 月)。这是我到目前为止写的内容 public static void main(String[] args) {
我已经搜索了该网站,但没有找到接近我需要的答案。基本上我的日期正确显示为“2013-05-09”,但我想要的是“2013 年 3 月 19 日”或使其更好“3 月 19 日, 2013 年”。 请向我
我需要使用 C# 更改日期字符串的格式 来自:“06/16/2010”或“16/06/2010” 至:“2010-06-16” 你能帮我实现这个吗 谢谢 最佳答案 如果您已经将它作为 DateTime
我正在以 MMM-yyyy 格式从 View 中提交日期值,即“Apr-2019”作为字符串。我需要将字符串值转换为 .Net 支持的日期格式,如 dd-MM-yyyy 或 yyyy-MM-dd。这里
我有一个包含以下数据的平面文件 2/12/2016 2/3/2017 12/23/2017 04/23/2017 第一个是 M/dd/yyyy,第二个是 M/d/yyyy,其余日期格式为 MM/dd/
好吧,我已经和这个战斗了足够长的时间。我有一个正则表达式 ^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d) 这将匹配 8/15、08/15
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Extending JavaScript's Date.parse to allow for DD/MM/Y
我有 json 对象列表,其中一个字段是日期。问题是日期在 json 中以不同的方式写入。 大多数看起来像: "publishedDate": "2005-01-28" "publishedDat
这个问题已经有答案了: Generate & parse "Year-Month" values in text from Java (1 个回答) 已关闭 7 年前。 我有一个变量: YearMon
我对日期格式有一个奇怪的问题。就像,我正在使用 jquery 日期选择器,它设置为格式 dd/mm/yy。因此,当我在该字段中填写 01/09/2015 时,它应该意味着日期是 2015 年 9 月
我有以下日期, 24/04/2019 13/05/2019 12/04/2019 我想删除年份并将这些日期转换为以下格式, 24/04 13/05 12/04 这不是仅用于输出我想在该日期执行加法或申
“YYYY”和“yyyy”之间的确切区别是什么。我读过 this link ,它指出 A common mistake is to use YYYY. yyyy specifies the calen
我有一个日期列,其中日期格式为 2010-04-14 在 SQL Server 中。有没有办法将日期格式检索为 14/04/2010 在选择语句中? 最佳答案 试试这个: SELECT CONVERT
我有这个正则表达式:(\d{4})\/(\d{2,4})\/?(\w{2})?这似乎工作正常,但我想避免以下情况,例如:我有一个字符串“2020/2000/WEEEE”并且它匹配它。 它匹配的其他错误
这是用户输入日期的代码:(它必须是我的日期选择器,但表单必须将日期字段作为文本提交 - 不要问) 提交时,我在 javascript 中调用验证逻辑。我附上了当我尝试输入 01/01/2001 作为用
我正在尝试以 YYYY-YY 格式提取会计日期字符串的最后一年 (YY)。例如,这个“1999-00”的最后一年是 2000 年。 当前代码似乎涵盖了除此之外的大多数情况。 import pandas
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Conversion of Date 我从对话框中获取的日期为:5-1-2012 - 作为字符串。 我需要将其转换为
我是一名优秀的程序员,十分优秀!