Как получить производителя автомобиля из VIN с помощью регулярного выражения

#java #regex #matcher #vin

#java #регулярное выражение #сопоставитель #vin

Вопрос:

Я пытаюсь написать метод, который принимает строку vin и возвращает несколько известных производителей (или неизвестных, если транспортное средство не является одним из них). Что я сделал до сих пор:

 /** World manufacturer identifier regex pattern for VW cars */
private static final Pattern VW_WMI_PATTERN = Pattern.compile("^.{6}S.{3}V.{6}");

/** World manufacturer identifier regex pattern for JMC cars */
private static final Pattern JMC_WMI_PATTERN = Pattern.compile("^(RL3DLT|LJXCU3).{3}M.{7}");

/**
 * returns vehicle enum based on input vin
 *
 * @param vin of vehicle
 * @return Vehicle manufacturer
 * */
public VehicleManufacturer getVehicleManufacturer(final String vin)
{
    if(isJMCVin(vin))
    {
        return VehicleManufacturer.JMC;
    }
    else if(isVWVin(vin))
    {
        return VehicleManufacturer.VW;
    }
    else
    {
        return VehicleManufacturer.UNKNOWN;
    }
}

/**
 * determine if vehicle is JMC
 *
 * @param vin of vehicle
 * @return true if vin is JMC
 * */
public static boolean isJMCVin(final String vin)
{
    final Matcher m = JMC_WMI_PATTERN.matcher(vin);
    return m.matches();
}

/**
 * determine if vehicle is VW
 *
 * @param vin of vehicle
 * @return true if vin is VW
 * */
public static boolean isVWVin(final String vin)
{
    final Matcher m = VW_WMI_PATTERN.matcher(vin);
    return m.matches();
}
  

Я хотел бы добавить Ford к этому, но я изо всех сил пытаюсь получить шаблон regex для ford.

Предыдущая попытка использовать хэш-таблицу для выполнения чего-то подобного имела следующую таблицу для ford :

 /** The mapping table that associates WMI values with vehicle manufacturers/brands. */
private static final Map<String,VehicleManufacturer> WMI_MANUFACTURER_TABLE = new Hashtable<String,VehicleManufacturer>();


// Populate the WMI to manufacturer lookup table.
    // Ford Vehicles
    for(final String wmi : new String[]{
            "1FA","1FB","1FD","1FM","1FT","2FA","2FD","2FM","2FT",
            "3FA","3FC","MAJ","MNB","MNC","NM0","SFA","TW2","VS6",
            "VSK","WF0","WF1","X9F","Y4F",
            "YYC","AFA",
            "AFM","EPF","FSA","FVL","JC0","JC6","JC7","KNA",
            "KNG","KNJ","LFA","MNA","PEL","SBC","SFA","SZA",
            "SZC","TW2","UN1","VSK","VS6","WF2","XLC","X9F",
            "1FC","1FF","1F0","1F1","1F6","1FD","1FF","1ZV",
            "1ZW","2FB","2FC","2FF","3FB","3FD","3FE","3FM",
            "3FT","3F8","6FP","8AF","8YT","9BF","SEL",
            "Z6F", //, 15219
            "LVS","RL3" //FB #15109
            })
    {
        WMI_MANUFACTURER_TABLE.put(wmi, VehicleManufacturer.FORD);
    }
  

Сейчас я пытаюсь использовать регулярное выражение, чтобы сделать то же самое.

Комментарии:

1. Почему вы пытаетесь использовать регулярное выражение здесь? Если у вас проблемы с шаблоном Ford, это может свидетельствовать о том, что регулярное выражение подходит не лучшим образом, особенно если Ford, похоже, использует так много префиксов (и вы, похоже, добавили пока только 3 производителя, так что может быть больше).

2. Кстати, я не очень хорошо знаком с VIN , но связанная статья в Википедии предполагает, что формат будет одинаковым для всех производителей с первыми 3 символами, определяющими самого производителя. Итак, не должно ли быть достаточно простого поиска по карте с соответствующей подстрокой VIN?