匹配可选部分的部分
match portions of an optional section
本文关键字:选部 更新时间:2023-09-26
我设置了一个正则表达式来匹配美国格式的日期和时间。 它看起来像这样:
/('d{1,2})'/('d{1,2})'/('d{2,4}) ('d{1,2}):('d{1,2})(am|pm|AM|PM|Am|Pm)/
但是,我还需要它来匹配不包含时间组件的日期。
我如何修改它,以便如果是日期,我得到3 个匹配项,如果是日期时间,我得到 6 个?
对时间进行分组并使其成为可选:
/('d{1,2})'/('d{1,2})'/('d{2,4})(?: ('d{1,2}):('d{1,2})(am|pm|AM|PM|Am|Pm))?/
?:
禁止捕获,因此在时间存在时,您最终不会得到额外的组。
此外,如果您对允许 aM
和 pM
不太挑剔,您可以使用不区分大小写的修饰符大大简化:
/('d{1,2})'/('d{1,2})'/('d{2,4})(?: ('d{1,2}):('d{1,2})([ap]m))?/i
事实上,使用 ?
您甚至可以进一步缩短模式,(因为'd?
比 {1,2}
短:
/('d'd?)'/('d'd?)'/('d{2,4})(?: ('d'd?):('d'd?)([ap]m))?/i
但是请注意,无论如何您仍然会得到 6 组(如果计算整体匹配,则为 7 组) - 只是最后三组将undefined
:
> groups = '11/11/11'.match(/('d{1,2})'/('d{1,2})'/('d{2,4})(?: ('d{1,2}):('d{1,2})([ap]m))?/i)
["11/11/11", "11", "11", "11", undefined, undefined, undefined]
改用exec
时也会发生同样的情况。但如有必要,这些很容易过滤掉:
> groups.filter(function(capture) {
return typeof capture !== 'undefined';
});
["11/11/11", "11", "11", "11"]
或者在这种情况下(因为您永远不能将空字符串作为捕获):
> groups.filter(function(capture) {
return capture;
});
["11/11/11", "11", "11", "11"]
使用?
时间正则表达式,包装器与非捕获组(?:)
。
/('d{1,2})'/('d{1,2})'/('d{2,4})(?:'s+('d{1,2}):('d{1,2})(am|pm|AM|PM|Am|Pm))?/
请注意,文字空间已替换为 's+
。
+
- 匹配 1 个或多个
*
- 匹配 0 或更多
?
- 匹配 0 或 1
你可以使用这个:
/('d{1,2})'/('d{1,2})'/('d{2,4})(?: ('d{1,2}):('d{1,2})(am|pm|AM|PM|Am|Pm))?/
甚至缩短您的正则表达式:
/('d{1,2})'/('d{1,2})'/('d{2,4})(?: ('d{1,2}):('d{1,2})([ap]m))?/i
我将空间和时间包装到一个非捕获组中,并放置一个 0 或 1 次出现的?
,以使时间可选。
字符类[ap]
匹配a
或p
,并且由于am
和pm
都以m
结尾,因此您可以简单地使用[ap]m
和不区分大小写的修饰符来使[ap]m
匹配大写和小写字符。
相关文章:
- 多个单选按钮组相互干扰
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 正在验证8个真/假复选框或复选框中的2个
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 使用Javascript获取所选选项ID
- 为复选框javascript指定两个值
- CKFinder 3为所选文件返回错误的URL
- 如何在单击复选框后调用控制器方法
- 是否可以禁用jquery中的单个单选按钮
- Javascript:无法获取变量中的单选按钮值
- 从复选框和Selects-KnockoutJS中获取值的总和
- 带有加号的电话号码验证(可选)
- JQuery覆盖不更改单选选项
- 如何让程序检查所选单词中是否有按键
- 选中多个具有相同名称的复选框
- 使用Jquery选择或取消选择ListView中的所有复选框
- 如何在从多选下拉列表中选择选项值时动态生成文本框
- 通过ajax到php文件获取单选按钮值
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- 互斥单选按钮和相应的输入字段