我有这样的一句话:
|date=[[19 Februari]] [[1942]] – [[10 Februari]] [[1943]]
我想检查一下我的行是否包含这样的字符串:
[[19 Februari]] [[1942]]
我认为,合适的模式是:
"(?s)(\\[)(\\[)[0-9]+(\\s)[abc]+(\\])(\\])(?s)"
我试过了:
public static void dumpDateTagger(String string) {
if(string.contains("–") || string.contains("-")){
Pattern pattern1 = Pattern.compile("(?s)(\\[)(\\[)[0-9]+(\\s)[abc]+(\\])(\\])(?s)");
Matcher matcher1 = pattern1.matcher(string);
if(matcher1.find()){
System.out.println("yes");
}
else{
System.out.println("no");
}
}
}
为什么这不起作用,永远找不到模式即时寻找?
答案 0 :(得分:0)
Pattern pattern1 = Pattern.compile(
"\\[\\[\\d{1,2}\\s\\w+\\]\\]\\s\\[\\[\\d{4}\\]\\]");
String line = "|date=[[19 Februari]] [[1942]] – [[10 Februari]] [[1943]]";
Matcher matcher1 = pattern1.matcher(line);
System.out.println(matcher1.find());
打印
真
[abc]
匹配小写字母a,b和c。匹配任何英文字母的一种方法是\\w
。编辑:您使用的(?s)
是所谓的标记表达式,并控制点字符是否可以匹配换行符。由于正则表达式中没有点,我们可以安全地离开(?s)
。
如果您想验证是否已找到有效日期,请将月,月和年的日期放在一起,并尝试将其解析为LocalDate
。
编辑:我已将代码更改为接受3位和4位数年份(如果您需要接受1或2位数年份,只需相应更改正则表达式。)
// Round brackets delimit capturing groups.
// \d{3,4} matches 3 or 4 digits for year.
Pattern pattern1 = Pattern.compile(
"\\[\\[(\\d{1,2})\\s(\\w+)\\]\\]\\s\\[\\[(\\d{3,4})\\]\\]");
Locale malay = Locale.forLanguageTag("ms");
// d and u match day-of-month and year in any number of digits.
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d MMMM u", malay);
// Test with 3 digit year.
String line = "|date=[[2 Januari]] [[934]] – [[4 Oktober]] [[958]]";
Matcher matcher1 = pattern1.matcher(line);
if (matcher1.find()) {
String date = matcher1.group(1) + ' ' + matcher1.group(2) + ' ' + matcher1.group(3);
try {
LocalDate localDate1 = LocalDate.parse(date, dateFormatter);
System.out.println("yes: " + localDate1);
} catch (DateTimeParseException dtpe) {
System.out.println("no: " + dtpe.getMessage());
}
} else {
System.out.println("no");
}
我得到了
是的:0934-01-02
在模式中,我添加了圆括号来定义group(int)
取出到新字符串中的组。请替换您想要的区域设置。我使用了马来语(ms
),但“Februari”可能是印度尼西亚语(id
或in
),也可能是其他语言。
答案 1 :(得分:0)
一些建议
实施例
String line = "|date=[[19 Februari]] [[1942]] – [[10 Februari]] [[1943]]";
String withoutBrackets = line.replaceAll("\\[", "").replaceAll("\\]", "");
Pattern pattern = Pattern.compile("(\\d+ \\w+ \\d{4})");
Matcher matcher = pattern.matcher(withoutBrackets);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d MMMM uuuu", Locale.forLanguageTag("ms"));
if (matcher.find()) {
String dateStr1 = matcher.group(1);
LocalDate date = LocalDate.parse(dateStr1, dateFormatter);
System.out.println(date);
}
if (matcher.find()) {
String dateStr2 = matcher.group(1);
LocalDate date = LocalDate.parse(dateStr2, dateFormatter);
System.out.println(date);
}