Я думаю, что это будет намного легче понять, если вы начнете с меньшей проблемы.Простейший способ сопоставления нескольких слов, разделенных пробелами:
(?i)^[A-Z0-9]+(?:[ _-][A-Z0-9]+)*$
Однако ваше регулярное выражение явно разрешено для них на конце строки, а мое - нет.Я предполагаю, что все в порядке, и поступлю так же, как вы:
(?i)^[A-Z0-9]+(?:[ _-][A-Z0-9]+)*[_-]?$
Попробуйте это последнее регулярное выражение и посмотрите, работает ли оно для вас.
РЕДАКТИРОВАТЬ: Якоря, ^
и $
, на самом деле не нужны, если вы используете метод matches()
, но они также не причиняют вреда, и они помогают сообщить ваше намерение.