Вы можете упростить это немного следующим образом:
^(?:(?:^|\s+)[a-zA-Z0-9-]{1,30}){1,5}\s*$
Синтаксис (?: )
- это группа без захвата, которая, как я считаю, должна улучшить производительность, когда вам не нужны группы как таковые.
Тогда уловка заключается в следующем утверждении:
(?:^|\s+)
Благодаря каретке это будет соответствовать началу строки или одному или нескольким символам пробела.
ОБНОВЛЕНИЕ: Это отлично работает в моем тестировании, и там, конечно, меньше избыточного кода.Тем не менее, я просто использовал бенчмаркинг в Regex Hero , чтобы обнаружить, что ваш оригинальный regex на самом деле быстрее.Вероятно, это связано с тем, что из-за того, что у меня происходит еще большее возвращение назад,
ОБНОВЛЕНИЕ № 2: Я нашел другой способ, который выполняет то же самое, я думаю:
^(?:\s*[a-zA-Z0-9-]{1,30}){1,5}\s*$
Я понял, что тоже пыталсяжесткий.\s*
соответствует 0 или более пробелам, что означает, что он будет работать для одного тега.Но ... это будет работать и для 2-5 тегов, потому что пробел не в вашем классе персонажей [ ]
.И действительно, он терпит неудачу с 6 тегами, как и должно быть.Это означает, что это гораздо более дальновидное регулярное выражение с меньшим количеством обратных возвратов, лучшей производительностью и меньшей избыточностью.
ОБНОВЛЕНИЕ № 3:
Я вижу ошибку своими путями.Это должно работать лучше.
^(?:\s*[a-zA-Z0-9-]{1,30}\b){1,5}\s*$
Помещение \b
непосредственно перед последним )
установит границу слова.Это позволяет правилу длины 1-30 символов снова работать правильно.