Java正则表达式模式匹配(爱尔兰汽车注册)

Java正则表达式模式匹配(爱尔兰汽车注册),java,regex,Java,Regex,抱歉,如果这是一个愚蠢的问题,但在过去的5天里它一直让我精神错乱 我正在尝试制作一个正则表达式模式,以匹配爱尔兰汽车登记示例“12-W-1234” 到目前为止,这就是我所拥有的: import java.util.ArrayList; import java.util.List; public class ValidateDemo { public static void main(String[] args) { List<String> input =

抱歉,如果这是一个愚蠢的问题,但在过去的5天里它一直让我精神错乱

我正在尝试制作一个正则表达式模式,以匹配爱尔兰汽车登记示例“
12-W-1234
” 到目前为止,这就是我所拥有的:

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("12-WW-1");
        input.add("12-W-223");
        input.add("02-WX-431");
        input.add("98-zd-4134");
        input.add("99-c-7465");


        for (String car : input) {
            if (car.matches("^(\\d{2}-?\\w*([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})$")) {
                System.out.println("Car Template " + car);
            }
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类ValidateDemo{
公共静态void main(字符串[]args){
列表输入=新的ArrayList();
输入。添加(“12-WW-1”);
输入。添加(“12-W-223”);
输入。添加(“02-WX-431”);
输入。添加(“98-zd-4134”);
输入。添加(“99-c-7465”);
for(字符串车:输入){
(KK| KKKKKKKKKKKKKKKKKKKKKKK10 10)ww中国(12410)ww瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦瓦124;;; c|; c| c| c| c c| c| c c|; c|; CeCe中国中国|;行政行政行政|中国中国|;中国中国中国中国中国中国中国124;中国中国中国中国(124;中国中国中国(124;中国)赛赛赛赛赛赛赛门门门门门门门第(124;中国中国中国)中国中国中国中国中国中国(124;中国中国)))中国中国中国中国中国中国中国中国中国(124;中国(124;中国中国)))中国中国中国(124;中国(124;中国)中国(中国)中国))中国)))|ls | mh | mh | mn | mn | mo | mo | oy | so | so | rn | tn | ts | w | w | wd | wd wh | wh | wx | | wx | | | | | | | | | | | | | wx | 124{
System.out.println(“汽车模板”+汽车);
}
}
}
}
当它检查注册表时,我的问题就出现了,在我的模式中,注册表中有一个单个字母。例如
'12-ZD-1234'
。 其中
ZD
不是有效的县ID,但由于
D
有效,因此允许显示该县ID

任何帮助都会很好

我已经在一些网站上做过研究,包括和

这些网站帮助了我,但我仍然有我的问题

顺便说一下,我将改变模式,把所有的输入变成 大写以减少代码的大小。
感谢您的帮助

除了其他人指出的
\\w*
之外,您还滥用了字符类(
[…]
)。要实际使用交替(
|
),请同时取出方括号:

^(\\d{2}-?(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})$
以下是一些示例,向您展示角色类的实际工作方式:

  • [abc]
    匹配单个字符,可以是
    a
    b
    c
  • [aabbcc]
    等同于
    [abc]
    (忽略重复项)
  • [|]
    匹配管道字符,即允许使用符号
  • [KK | KK | ww | ww | c | c | ce | ce…]
    最终等同于
    [K | wWcCeE…]
    ,因为重复项同样被忽略

  • 使用交替运算符(
    |
    )执行所需操作是正确的,但不需要使用字符类。

    您可以这样改进您的模式:

    ^[0-9]{2}-?(?>c[enw]?|C[ENW]?|dl?|DL?|g|G|k[eky]|K[EKY]|l[dhkms]?|L[DHKMS]?|m[hno]|M[HNO]|oy|OY|rn|RN|so|SO|t[ns]|T[NS]|w[dhx]?|W[DHX]?)-?[0-9]{1,4}$
    
    如果你不关心信件的情况:

    ^(?i)[0-9]{2}-?(?>c[enw]?|dl?|g|k[eky]|l[dhkms]?|m[hno]oy|rn|so|t[ns]|w[dhx]?)-?[0-9]{1,4}$
    
    请注意,如果字符串必须仅包含汽车注册号,则锚定(
    ^
    $
    )非常有用


    注2:如果您将最频繁的县放在替换的第一位,您可以对其进行更多的改进。

    爱尔兰数字板也可以以三位数字开始,自2013年以来,它们现在是(年)(1 | 2)-(县)-(数),因此正则表达式可以简单地是(\d+-?\w{2}-?\d+)


    但是,验证的最佳形式是针对车辆注册API运行此操作,例如-因为这将确定车辆是否已注册,而不仅仅是格式正确。

    为什么在有效国家/地区代码列表之前有\\w*部分?是的,\\w*是导致问题的原因。如果您已经有一个完整的县代码列表,只需使用它们。不需要全局设置任何内容。如果我不使用\\w*它将只接受单个值,例如“12-WW-1”将无效,但“12-w-1”将有效。@user3007858如果helped@Reimeus-谢谢,莱默斯。也许他确实需要他的锚。我不完全了解他的背景,所以我只改变了看起来不对劲的地方。