Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Можно ли оптимизировать проверку строки?

#java #регулярные_выражения


Здравствуйте.
Есть строка, счет теннисного матча. Она может иметь следующие значения:
"15:15","30:0","0:30","1:1","2:0","0:2".
Я по-колхозному создаю паттерн:

private static final String THIRD_POINT_PATTERN = "(^@?15:15@?$)|(^@?30:0@?$)|(^@?0:30@?$)|(^@?2:0@?$)|(^@?0:2@?$)|(^@?1:1@?$)";


и проверяю строковую переменную pointThree на соответствие этому паттерну:

Pattern pExpectedScore = Pattern.compile(THIRD_POINT_PATTERN);
if (!pExpectedScore.matcher(pointThree).find()) {
            return false;
        }


Можно ли это делать без написания такого длинного патерна? 
    


Ответы

Ответ 1



Первое, что приходит в голову - это записать просто и понятно ^(15:15|30:0|0:30|1:1|2:0|0:2)$ дальше можно немного пожать нолики, правда, короче выражение от этого не станет: ^(15:15|(30|2):0|0:(30|2)|1:1)$ И ещё можно обратить внимание на 15:15 и 1:1: ^((15?):\2|(30|2):0|0:(30|2)$ Можно пошаманить с симметричностью, но оно только более мутным станет: ^((15?):\2|(?=\d+:\d+$)(0:)?(30|2)(:0)?)$ И можно общий формат оттащить в начало: ^(?=\d+:\d+$)((15?):\2|(0:)?(30|2)(:0)?)$ На этом у меня идеи закончились. PS: Мне тут самый первый вариант больше всего нравится.

Ответ 2



Учитывая, что строки просто проверяются на совпадение, можно хранить их в множестве. Set validScores = new HashSet<>(Arrays.asList("15:15","30:0","0:30","1:1","2:0","0:2")); затем искать строку в множестве: boolean isValidScore(String score) { return validScores.contains(score); } для гибкости, в дальнейшем можно считывать список допустимых счетов из файла или БД.

Ответ 3



Как вариант: (3?0|15):(3?0|15)|[0-2]:[0-2] Если вспомнить теннис, где есть ещё 40 поинтов и 6 геймов, то как-то так: ([34]?0|15):([34]?0|15)|[0-6]:[0-6] P.S. Но, как верно намекнул Qwertiy: чем проще регулярка читается, тем приятнее ))

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

Отправить комментарий