我的文字行如下。我只想要考试日期之后的第一个日期,以便预期的输出是10.08.2017
Examination Date
date: 10.08.2017
423432
tert
g
534534
Examination Date: 04-07-2017
到目前为止,我已尝试过:
Examination Date.*?\d{2}.?{2}?.\d{4}
但我将整个结果发送到04-07-2017
答案 0 :(得分:2)
通过在\d
之前添加{2}?
来修复模式,并删除不必要的?
s abd捕获您需要的值:
String s = "Examination Date \n\ndate: 10.08.2017 \n423432\n\ntert\n\ng\n\n534534\n\nExamination Date: 04-07-2017";
Pattern pattern = Pattern.compile("Examination Date.*?\\b(\\d{2}\\W\\d{2}\\W\\d{4})\\b", Pattern.DOTALL);
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
System.out.println(matcher.group(1)); // => 10.08.2017
}
请参阅Java demo和regex demo。在代码中,您只能使用if
时的第一个匹配,而不是while
,而.
会因Pattern.DOTALL
修饰符而匹配换行符。
<强>详情
Examination Date
- 文字子字符串.*?
- 任意0个字符,尽可能少\\b
- 一个单词边界(如果您不关心将日期作为“整个”单词匹配,请删除\\b
)(\\d{2}\\W\\d{2}\\W\\d{4})
- 第1组:
\\d{2}
- 2位数\\W
- 任何非单词字符(标点符号,空格,符号)\\d{2}\\W
- 如上所述\\d{4}
- 4位数\\b
- 一个尾随字边界。