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

Java 用于匹配多个日期格式的正则表达式?,java,android,regex,Java,Android,Regex,抱歉,如果这是一个noob问题,但我对regex不是很满意,而且(到目前为止)这有点超出我的理解 我的困境是,我们有大量的ID徽章可以扫描到android应用程序中,而我正试图解析出一些日期 例如,某些日期的表示方式如下: "ISS20141231" format = yyyyMMdd desired output = "20141231" "ISS12312014" format = MMddyyyy desired output = "12312014" "ISS12-31-

抱歉,如果这是一个noob问题,但我对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+字节)字符串以查找匹配项

您可以进行两次替换,即先替换
ISS
,然后再替换
/
-

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

您可以进行2次更换,即先更换
ISS
,然后再更换
/
-

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

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

ISS([\\d\\-/]{8,10})
然后在检索捕获组时,去掉连字符和斜杠

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

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

ISS([\\d\\-/]{8,10})
然后在检索捕获组时,去掉连字符和斜杠

String dateStr = m.group(1).replaceAll("[/\\-]", "");
或仅使用正则表达式: 搜索:ISS([0-9])([-./])([0-9])([-./])([0-9]*) 替换:${1}${3}${5}

或仅使用正则表达式: 搜索:ISS([0-9])([-./])([0-9])([-./])([0-9]*)
Replace:${1}${3}${5}

根据,不能简单地用正则表达式从字符串中删除连字符。这必须像@anabhava对replace语句所做的那样进行。根据本文,我们不能简单地用正则表达式从字符串中删除连字符。它必须像@anabhava在replace语句中所做的那样完成。这是一个绝妙的解决方案!谢谢对于其他用户来说,这只是一个小小的更正,\\d-/模式的一部分将其视为一个范围(从\d到/),这并不完全正确。需要是ISS([\\d\\-/]{8,10})注意破折号前的反斜杠\-否则这是完美的解决方案!谢谢对于其他用户来说,这只是一个小小的更正,\\d-/模式的一部分将其视为一个范围(从\d到/),这并不完全正确。需要是ISS([\\d\\-/]{8,10})注意破折号前的反斜杠\-否则这是完美的这会产生多个组吗?仍然需要循环?唉,它不是一个与Java兼容的正则表达式,因为Java只支持$1。我的错。这会产生多个组?仍然需要循环?唉,它不是一个与Java兼容的正则表达式,因为Java只支持$1。我的错。