Предполагая, что правила такие же, как вы сказали: буквальные или начинаются с *.
Java:
public static boolean matches(String candidate, List<String> rules) {
for(String rule : rules) {
if (rule.startsWith("*")) {
rule = rule.substring(2);
}
if (candidate.endsWith(rule)) {
return true;
}
}
return false;
}
Это масштабируется до количества правил, которые у вас есть.
EDIT:
Просто чтобы прояснить это.
Когда я говорю «сортировать правила», я действительно имею в виду создание дерева из символов правила.
Затем вы используете строку соответствия, чтобы попытаться пройтись по дереву (то есть, если у меня есть строка xyz, я начинаю с символа x и проверяю, имеет ли она ветвь y, а затем дочерний элемент z).
Для «подстановочных знаков» я бы использовал ту же концепцию, но заполнил ее «задом наперед», и прошел бы ее задним числом кандидата на матч.
Если у вас много (много) правил, я бы отсортировал правила.
В случае совпадений без подстановочных знаков вы выполняете итерацию для каждого символа, чтобы сузить возможные правила (т. Е. Если он начинается с "w", то вы работаете с правилами "w" и т.
Если это совпадение с подстановочным знаком, вы делаете то же самое, но работаете со списком «обратных правил» и просто сопоставляете конец строки с концом правила.