检测行是否包含某些数字和字母字符串模式

时间:2018-04-30 04:35:37

标签: java

我有这样的一句话:

|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");
        }
    }

}

为什么这不起作用,永远找不到模式即时寻找?

2 个答案:

答案 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”可能是印度尼西亚语(idin),也可能是其他语言。

答案 1 :(得分:0)

一些建议

  • 如果括号不重要,我建议在尝试使用正则表达式之前删除它们,这样可以避免使用非常复杂的正则表达式。
  • 只需为日期写一次正则表达式并调用.find()两次,再次简单的正则表达式
  • Adya建议我也使用内置的Java日期时间解析功能。

实施例

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);
}