Мне кажется, что нарезка - это не столько проблема, которая отличается от того, когда ваши собственные классы и программы плохо архивируются / разработаны.
Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).
Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.
Попробуйте следующее:
^[-\w\s]+(?:,[-\w\s]*)*$
Использование ^
и $
гарантирует, что мы проверим все значение и не просто найдем совпадение где-то внутри.
Первый класс символов [-\w\s]+
позволяет использовать один или несколько буквенно-цифровых символов, пробелов или знаков пропуска. Черта должна идти сначала в скобках класса.
Вторая группа допускает ноль или более повторений с разделительными запятыми. Он заключен в неконвертируемые круглые скобки, небольшая оптимизация производительности: (?: … )*
Примечания:
A,B,,D
. Если вы не хотите этого допускать, измените второй-последний *
на +
. \w
позволяет подчеркнуть. Чтобы предотвратить это, замените их на A-Za-z0-9
. Использовать классы символов.
^([0-9A-Za-z -]+)(,[0-9A-Za-z -]+)*$
Обратите внимание, что \w
содержит символы подчеркивания, поэтому я расширяю его до буквенно-цифровых диапазонов.
Благодаря @Jay для указания отсутствующие якоря.
Попробуйте следующее:
[-\w\s]+(,[-\w\s]+)*
[-\w\s]
означает символ, пробел или дефис.
Обычно символ слова включает _
, поэтому вы можете захотеть заменить что с A-Za-z0-9
, если вы хотите предотвратить это.
[-A-Za-z0-9\s]+(,[-A-Za-z0-9\s]+)*
!@#$%^&*()0,
– Jay
11 September 2013 в 17:00
search
сделано, а не match
. Я принял последний. У вас тоже будет работать, но у вас будут избыточные символы для match
. Я понимаю, что некоторые языки могут поддерживать только один из них, и я не знаю, что использует SobiPro, поэтому он действительно может быть search
, хотя мое (возможно, неверное) предположение, основанное на вопросе, заключается в том, что регулярное выражение работает, за исключением -
, поэтому он использует / поддерживает match
, поскольку регулярное выражение не содержит ^
или $
.
– Dukeling
11 September 2013 в 17:11
matches
, которая сравнивает всю строку с регулярным выражением. Если такая функция используется, ^
и $
не требуются. Java также имеет функцию find
, для которой требуются ^
и $
.
– Dukeling
11 September 2013 в 17:56
Для этого можно использовать класс символов :
[\w\s-]+(,[\w\s-]*)*
Я сделал класс символов внутри группы опциональным, чтобы разрешить пустые поля.
Если ваш валидатор не заставляет регулярное выражение всегда соответствовать всем полям ввода, вам может понадобиться anchor , окружая его ^
в начале и $
на конец.