为什么这个正则表达式不能按照我想要的方式工作
Why doesn't this regular expression work the way I want it?
我试图让正则表达式在日期字符串中找到数字(例如,04/05/1989)。这是我所拥有的:
'A0[1-9]{2}'/0[1-9]{2}'/[1900-2012]'z
方括号创建字符范围,而不是数字范围:
-
[A-Z]
匹配从A
到Z
的所有 ASCII 字符。 -
[1900-2012]
匹配1
、9
、0
、0
和2
之间的ASCII字符范围、0
、1
和2
。实际上,相同的可以表示为[0-29]
。
在字符范围表达式中,字符的顺序并不重要。 [0815]
与[8510]
相同。因此[1900]
与[019]
相同。
您希望(19[0-9]{2}|200[0-9]|201[0-2])
与正确的年份范围匹配。或者,如果您只想匹配四位数并且不想进行范围验证,则可以使用([0-9]{4})
月和日相同。您可以使用范围验证来执行此操作,也可以通过匹配一位或两位数字来完成。我会推荐后者。
^([0-9]{1,2})/([0-9]{2})/([0-9]{4})$
尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查生成的日期是否在所需范围内。正则表达式是提供日期有效性检查的错误工具。
我在这里回答了一个类似的问题:如何在JavaScript中解析格式为"YYYYmmdd"的日期?它只需要在提取部分进行一些修改。
编辑:您可以通过以下方式修改该函数:
function parse(str) { // str format: 'dd/mm/yyyy'
var d = str.substr(0,2),
m = parseInt(str.substr(3,2)) - 1,
y = str.substr(6,4);
var D = new Date(y,m,d);
return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}
(?<!'d)((0?'d)|([12]'d)|(3[01]))/((0?'d)|(1[0-2]))/((19)|(20))'d'd
似乎在我做的测试中有效。
(?<!'d)((((0?'d)|([12]'d)|(3[01]))/(((0?((1[02]?)|([3578]))))|(1[0-2])))|(((0?'d)|([12]'d))/(0?2))|(((0?'d)|([12]'d)|(30))/((0?[2469])|(11))))/((19)|(20))'d'd
以前的正则表达式匹配无效日期,例如31/02/2012
但这个似乎更规范一些。
恕我直言,这将不匹配有效的10/10/1989
,但会匹配无效099/0991989
。首先,0[1-9]{2}
匹配0
加上1
和9
之间的两位数。另外[1900-2012]
也不是你想要的。
试试这个
'A[0-9]{2}'/[0-9]{2}'/[1900-2012]'z
它应以 DD/MM/YYYY(1900 到 2012 年)格式匹配日期
相关文章:
- 在多行图表中,在每一行的末尾,我想要一个小圆圈和使用d3.js的端点值
- 我想要相同的函数以两种方式反应
- 如何在javascript中创建一个空的2d数组?下面是我想要创建的一个示例
- 如何用javascript发送多个文件没有jQuery我想要每个文件一个进度条
- 我想要一个类似于网站 https://onlycoin.com/ 的jQuery鼠标滚动动画效果
- 我想要“鼠标滚轮事件延迟”
- 如何格式化我返回的url,使其符合我想要的路由
- 如何使用facet指定我想要的字段
- json_encode($myVar);正在给出地图,我想要一个字符串数组
- Javascript:我可以't找到正确的方式来表达布尔“;如果“;以得到我想要的结果
- 指令没有按照我想要的方式行事 - AngularJS
- j查询下拉菜单.页面标记无法正常工作 - 或者我想要它的方式
- 为什么这个正则表达式不能按照我想要的方式工作
- .filter() 中的函数没有按我想要的方式工作
- html5本地存储没有按我想要的方式工作
- 没有按照我想要的方式获得json
- 我的visibility_toggle没有按我想要的方式工作
- 写一个coffeescript函数,将json数组转换成我想要的格式,这是一种简洁的方式
- 为什么setTimeout动画在javascript不工作的方式,我想要它
- jQuery克隆方法没有按我想要的方式工作