经过大量的搜索和阅读,我不确定我想要做的是一步到位。我希望它与之匹配:
(\d{1,4})/(\d{1,2})/(\d{1,2})
2011/12/13
或者
(\d{1,2})/(\d{1,4})/(\d{1,2})
12/2011/13
或者
(\d{1,2})/(\d{1,4})/(\d{1,2})
12/13/2011
在一个正则表达式中捕获括号中的值。
所以我所做的就是将这三个语句包装成非捕获or
语句:
^(?:(\d{1,4})/(\d{1,2})/(\d{1,2}))|(?:(\d{1,2})/(\d{1,4})/(\d{1,2}))|(?:(\d{1,2})/(\d{1,2})/(\d{1,4}))$
唯一的问题是如果在此
上使用它2011/12/13
我得到的是:
2100
10
10
Empty
Empty
Empty
Empty
Empty
Empty
我真的不喜欢空的捕捉。我可以设置它们,只返回非mpty字符串吗?!
我可以想到很多变通方法仍然可以完成这项工作,首先匹配正确的模式,然后匹配正确的捕获,检查捕获的值是否有多个空字符串,但在我看来这个应该可以在正则表达式本身。
非常感谢任何帮助。
谢谢:)
答案 0 :(得分:5)
怎么样:
^(?:(?=\d{1,4}/\d{1,2}/\d{1,2})|(?=\d{1,2}/\d{1,4}/\d{1,2})|(?=\d{1,2}/\d{1,2}/\d{1,4}))(\d+)/(\d+)/(\d+)$
3向前看确保您有3种格式中的任何一种格式的日期,然后捕获日期的3个元素。
<强>解释强>
^ : begining of the string
(?: : begin non capture group
(?=\d{1,4}/\d{1,2}/\d{1,2}) : assume the format is yyyy/mm/dd
| : or
(?=\d{1,2}/\d{1,4}/\d{1,2}) : format dd/yyyy/mm
| : or
(?=\d{1,2}/\d{1,2}/\d{1,4}) : format dd/mm/yyyy
) : end of non capture group
(\d+)/(\d+)/(\d+) : capture the 3 elements
$ : end of string
答案 1 :(得分:1)
这是我的刺(短而甜):
(\d{2,4})(?=/)/(\d{2,4})(?=/)/(\d{2,4})$