我正在尝试使用正则表达式从字符串中提取2个日期 - 由于某种原因 - 正则表达式不提取日期 - 这是我的代码:
private String[] getDate(String desc) {
int count=0;
String[] allMatches = new String[2];
Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)").matcher(desc);
while (m.find()) {
allMatches[count] = m.group();
}
return allMatches;
}
我的字符串desc是:"coming from the 11/25/2009 to the 11/30/2009"
我得到一个空数组...
答案 0 :(得分:11)
你的正则表达式首先匹配日期和月份(DD / MM / YYYY),而输入则以月份和日期(MM / DD / YYYY)开头。
此外,您的日期后面必须跟一个逗号匹配((?:,)
部分)。
这个应该符合您的需求:
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d
图Debuggex。
答案 1 :(得分:7)
3个问题:
1)您尝试使用格式dd/MM/YYYY
解析日期,其中正则表达式的格式为MM/dd/YYYY
。
2)你忘了在while循环中增加count
。
3)正则表达式末尾的(?:,)
部分是无用的。
此代码适用于我的电脑:
private static String[] getDate(String desc) {
int count=0;
String[] allMatches = new String[2];
Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d").matcher(desc);
while (m.find()) {
allMatches[count] = m.group();
count++;
}
return allMatches;
}
测试:
public static void main(String[] args) throws Exception{
String[] dates = getDate("coming from the 25/11/2009 to the 30/11/2009");
System.out.println(dates[0]);
System.out.println(dates[1]);
}
输出:
25/11/2009
30/11/2009
答案 2 :(得分:4)
您的月份和日期已经倒退,(?:,)
在每个日期结束时需要逗号。试试这个:
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d
答案 3 :(得分:0)
日期模式识别算法,不仅可识别日期模式,还可以Java日期格式提取可能的日期。该算法非常快速且轻量级。处理时间是线性的,所有日期都在一次通过中识别。算法使用树遍历机制解析日期。树数据结构是自定义创建的,用于构建支持的日期,时间和月份模式。
该算法还确认日期文字之间的多个空格字符。例如。 DD DD DD和DD DD DD被视为有效日期。
以下日期模式被认为是有效的,并且可以使用此算法识别。
dd MM(MM)yy(yy)yy(yy)MM(MM)dd MM(MM)dd yy(yy)
其中M是月份字面值是字母格式,如Jan或January
日期之间允许的分隔符是' /',' \',' ',',',' |',' - ',' '
它还识别以下格式的尾随时间模式hh(24):mm:ss.SSS am / pm hh(24):mm:ss am / pm hh(24):mm:ss am / pm
分辨率时间是线性的,不使用模式匹配或强力。该算法基于树遍历并返回,日期列表具有以下三个组成部分 - 文本中标识的日期字符串 - 转换后的&格式化日期字符串 - SimpleDateFormat
使用日期字符串和格式字符串,用户可以根据需要自由地将字符串转换为对象。
算法库可在maven central获得。
<dependency>
<groupId>net.rationalminds</groupId>
<artifactId>DateParser</artifactId>
<version>0.3.0</version>
</dependency>
使用此示例代码如下所示。
import java.util.List;
import net.rationalminds.LocalDateModel;
import net.rationalminds.Parser;
public class Test {
public static void main(String[] args) throws Exception {
Parser parser=new Parser();
List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted");
System.out.println(dates);
}
}
输出:[LocalDateModel {originalText = 2015-january-10 18:00:01.704,dateTimeString = 2015-1-10 18:00:01.704,conDateFormat = yyyy-MM-dd HH:mm:ss.SSS,start = 18,结束= 46}]
http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html
上的详细博客完整的来源可在GitHub https://github.com/vbhavsingh/DateParser
上找到答案 4 :(得分:0)
class ThirdComponent extends Component {
render() {
return (
// print score which is in redux
<div>this.props.score</div>
);
}
}
export default connect(mapStateToProps)(ThirdComponent);
代替正则表达式对于这样的问题,正则表达式可能过度。
您可以在SPACE字符上拆分字符串,并尝试将每个元素解析为LocalDate
。如果解析失败,请转到下一个元素。
redux
请参阅此code run live at IdeOne.com。
日期:[2009-11-25,2009-11-30]