Java 从字符串中提取随机格式的年份

Java 从字符串中提取随机格式的年份,java,regex,Java,Regex,我正试图在一个字符串中检测年份。我看了很多以前问过的问题,但找不到一个可以解决随机格式的问题。比如说,我正在为2001年的福特Explorer搜索一个零件,我想过滤结果以删除不适用于该年的零件。我可能会遇到以下年份格式。我原以为String.contains(“01”)可以,但这也与2010年相匹配,并且没有说明我搜索的年份完全不在字符串中,而是在其他年份之间。一个正则表达式是否可能涵盖所有这些场景 适合2001年福特探险家 适合1997-2002年福特探险家 适合01福特探险家 01福特探险

我正试图在一个字符串中检测年份。我看了很多以前问过的问题,但找不到一个可以解决随机格式的问题。比如说,我正在为2001年的福特Explorer搜索一个零件,我想过滤结果以删除不适用于该年的零件。我可能会遇到以下年份格式。我原以为String.contains(“01”)可以,但这也与2010年相匹配,并且没有说明我搜索的年份完全不在字符串中,而是在其他年份之间。一个正则表达式是否可能涵盖所有这些场景

  • 适合2001年福特探险家
  • 适合1997-2002年福特探险家
  • 适合01福特探险家
  • 01福特探险家
  • 适合97-02福特探险家
  • 适合97至(或通过)02福特探险家
企图 如果2010年返回错误。如果前一个数字是空格或破折号,并且expectedYear位于字符串开头,则返回true。
未解决预期年份介于其他两年之间的问题。

您可以使用此正则表达式:

(\d{4}|\d{2}-\d{2}|\d{2})
但是,这只会检测模式是否匹配。您需要添加更多的逻辑来确保它是有效的

请访问以下网址:


它可以用Java实现,如下所示

Pattern patt = Pattern.compile("(?:Fits )?(97|1997)?(?:[^0-9]+)?(01|02|200[12]) Ford Explorer.");
// add code to iterate lines
String s = "Fits 1997-2002 Ford Explorer.";
Matcher m = patt.matcher(s);
if(m.matches()){
    if(m.group(1) != null){
        //validate year 1997
    }
    if(m.group(2) != null){
        //validate year 2002
    }
}

哇,这个工具太棒了。看看regex在做什么,世界就大不相同了。我可以看到如何使用正则表达式来检测今年可能发生的事情,然后验证它。如果字符串中的年份是2010年,我可以看到哪里会出现误报,因为它包含01。如果正则表达式是4位数年份的最后2位数,或者前面没有2位数,是否有办法使正则表达式只与2位数年份匹配?
Pattern patt = Pattern.compile("(?:Fits )?(97|1997)?(?:[^0-9]+)?(01|02|200[12]) Ford Explorer.");
// add code to iterate lines
String s = "Fits 1997-2002 Ford Explorer.";
Matcher m = patt.matcher(s);
if(m.matches()){
    if(m.group(1) != null){
        //validate year 1997
    }
    if(m.group(2) != null){
        //validate year 2002
    }
}