Какое наиболее элегантное решение проверки строки?
Допустим задана строка: 30573484
Есть правило: "30,25,-307,89" (начало строки должно совпадать с любым набором чисел между запятыми и НЕ совпадать, если перед набором стоит отрицательный знак)
Нужно проверить строку на соответствие правилу.
Пример заданных строк:
30573484 - ОК
30773484 - BAD
27833452 - BAD
25245455 - ОК
89345354 - ОК
OVK2015: так работает, но наверное все таки не совсем понятна задача, регулярку под конкретное условие написать для меня не проблема, нужна универсальность, например у меня есть 2 строки (правило, строка), причем я не вижу эти строки, но отдаю скрипту, он должен проверить строку на соответствие правилу. Вы исключили "307" при помощи правила "[0-6,8-9]" потому, что Вы видите в каком диапазоне лежит число 7, т.е. так не подходит.
OVK2015: даже не знаю как это назвать)) Видимо придется разбивать строку на 2 массива (разрешенные, запрещенные) и делать 2 проверки, как предлагает С Sharp, просто думал кто то подскажет более красивое решение.
По идеи там ничего военного быть не должно:
1. Ф-ция принимает строку условие, разбивает на массив отдельных условий;
2. Флажок валидности = false;
3. Сортирует массив(сначала идут 100% не валидные)
4. В foreach проверяет каждое из условий. Если среди валидных встретилось совпадение,- ф-ция возвращает true;
4 После цикла возвращаем false;
Примерно так.
entermix:
UPD. Для п.4 Если совпадение среди не валидных выходим с false, если совпадение среди валидных,- с true. Просто еще один if добавится. А массив общий
Вся идея в том, что т.к. не валидные условия начинаются с "-", они окажутся в начале массива. И если будет совпадение с валидным,- то можно прерывать дальнейший цикл. С не валидным совпадения гарантировано уже не будет. Например, как в случае:
30573484 - ОК
30773484 - BAD