正则表达年份范围

时间:2013-11-25 11:57:35

标签: java regex

import java.util.ArrayList;
import java.util.List;

public class ValidateDemo {
    public static void main(String[] args) {
        List<String> input = new ArrayList<String>();
        input.add("2005-WW-1");
        input.add("3012-W-223");
        input.add("1952-WX-431");
        input.add("19998-d-4134");
        input.add("1899-c-7465");


        for (String car : input) {
            if (car.matches("^\b(19[3-9][0-9]|200[0-9]|201[0-2])\b-?(KK|kk|ww|WW|c|C|ce|CE|cn|CN|cw|CW|d|D|dl|DL|g|G|ke|KE|ky|KY|l|L|ld|LD|lh|LH|lk|LK|lm|LM|ls|LS|mh|MH|mn|MN|mo|MO|oy|OY|so|SO|rn|RN|tn|TN|ts|TS|w|W|wd|WD|wh|WH|wx|WX)-?\\d{1,4}\\d)$")) {
                System.out.println("Car Template " + car);
            }
        }
    }
}

我试图让它与1980 - 2015年的汽车登记牌相匹配(我知道这不是我的模式中的东西)但我一直得到“无与伦比的关闭”)“”错误。

因此,例如“2005-WW-1”应该是唯一符合模式的输入。

4 个答案:

答案 0 :(得分:1)

  • 从正则表达式的末尾删除最后一个右括号 - 它应该看起来像-?\\d{1,4}\\d$"或更简单\\d{2,5}$
  • 如果您希望它代表字边界,请将\b(退格符号)更改为\\b
  • 另外,不要用正则表达式检查整数范围,因为它不适合这个。保持这样的正则表达将是噩梦。而是将您感兴趣的部分转换为整数(您可以使用Integer.parseInt(String))并使用正确的比较运算符组合(<><=>= )。

答案 1 :(得分:0)

你的正则表达式包含2个左括号(()和3个右括号())。

错误

  

无与伦比的结束')'

具有相当的描述性。

我假设你必须在这附近的某处添加一个左括号:

-?\\d{1,4}\\d)$

我的正则表达不充分,但我相信这就是你想要的:

-?(\\d{1,4}\\d)$

为什么不直接获得前4个字符并查看它们是否在某个范围内?

var year = Integer.Parse(myString.SubString(0, 4)); // Error checking omitted

if(year > 1985 && year < 2005) { }

答案 2 :(得分:0)

  1. 最后还有一个额外的关闭术语
  2. \b应为\\b
  3. 删除最后的\\d(如果您只想匹配2到5,则将其前面的if (car.matches("^\\b(19[3-9][0-9]|200[0-9]|201[0-2])\\b-?(KK|kk|ww|WW|c|C|ce|CE|cn|CN|cw|CW|d|D|dl|DL|g|G|ke|KE|ky|KY|l|L|ld|LD|lh|LH|lk|LK|lm|LM|ls|LS|mh|MH|mn|MN|mo|MO|oy|OY|so|SO|rn|RN|tn|TN|ts|TS|w|W|wd|WD|wh|WH|wx|WX)-?\\d{1,4}$")) { 更改为{2,5}}
  4. 所以,这有效:

    {{1}}

    另请注意,这与您在文字中指定的1930年以后而不是1980年相匹配。

答案 3 :(得分:0)

我建议像Pshemo的回答一样,实现为:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.*;

public class ValidateDemo
{
    public static void main(String[] args) {
        List<String> input = new ArrayList<String>();
        input.add("2005-WW-1");
        input.add("3012-W-223");
        input.add("1952-WX-431");
        input.add("19998-d-4134");
        input.add("1899-c-7465");

        String re = "^(\\d+)-?(KK|WW|C|CE|CN|CW|D|DL|G|KE|KY|L|LD|LH|LK|LM|LS|MH|MN|MO|OY|SO|RN|TN|TS|W|WD|WH|WX)-?\\d{1,4}$";
        Pattern p = Pattern.compile(re, Pattern.CASE_INSENSITIVE);

        for (String car : input) {
            Matcher m = p.matcher(car);
            System.out.print(car + " - " + m.matches() + " - ");
            System.out.print(m.group(1));
            int year = Integer.parseInt(m.group(1));
            if( year >= 1980 && year <= 2015 ) System.out.println(" <-- CORRECT");
            else System.out.println();
        }
    }
}

注意:

  1. 使用不区分大小写的匹配来减少RegExp的大小!
  2. 使用捕获组获取年份并使用Java检查,而不是使用可疑的RegExps!
  3. 我拿出了边界;如果根据您的业务规则这是不正确的,可以很容易地将其放回