用于匹配多种日期格式的正则表达式?

时间:2016-05-27 22:01:40

标签: java android regex

很抱歉,如果这是一个菜鸟问题,但我对正则表达式不太满意(截至目前),这有点超出了我的理解。

我的困境是我们有一些ID标记被扫描到一个Android应用程序中,而我正试图解析一些日期。

例如,某些日期的表示如下:

"ISS20141231"   format = yyyyMMdd   desired output = "20141231"
"ISS12312014"   format = MMddyyyy   desired output = "12312014"
"ISS12-31-2014" format = MM-dd-yyyy desired output = "12312014"

目前我有一个正则表达式模式:

Pattern p = Pattern.compile("ISS(\\d{8})");
Matcher m = p.matcher(scanData);

在前两个例子中工作正常,但最近我意识到我们偶尔会有使用破折号(或斜杠)作为分隔符的日期。

是否有一种有效的方法来提取这些日期而无需编写多个模式并循环检查每个模式以查找匹配项?

可能类似于:“ISS([\ d {8}(\ d {2} \ w \ d {2} \ w \ d {4})(\ d {4} \ w \ d {2} \ W \ d {2})])“

谢谢!

[编辑] 只是为了让事情变得更加清晰。子串(“ISSMMddyyyy”)来自一个更大的字符串,可以位于其中的任何位置。因此正则表达式必须搜索原始(200+字节)字符串以进行匹配。

3 个答案:

答案 0 :(得分:1)

你可以做2替换,即先替换ISS,然后替换/-

str = str.replaceFirst("^ISS", "").replaceAll("[/-]", "");

答案 1 :(得分:1)

如果该日期字符串实际上是较大字符串的子字符串,因此您需要正则表达式以便也搜索该模式,您可以将正则表达式修改为:

ISS([\\d\\-/]{8,10})

然后在检索捕获组时,删除连字符和斜杠。

String dateStr = m.group(1).replaceAll("[/\\-]", "");

答案 2 :(得分:0)

或者只使用正则表达式: 搜索:ISS([0-9] )([ - 。/] )([0-9] )([ - 。/] )([0-9 ] *) 替换:$ {1} $ {3} $ {5}