Как регулярное выражение сопоставляет строку из чисел и дефисов, но не начинается и не заканчивается дефисом? - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть некоторый код, проверяющий строку от 1 до 32 символов, которая может содержать только буквенно-цифровые и дефисы ('-'), но не может начинаться или заканчиваться дефисом.

Я использую регулярные выражения PCRE и PHP (хотя PHP-часть не очень важна в этом случае).

Прямо сейчас псевдокод выглядит так:

if (match("/^[\p{L}0-9][\p{L}0-9-]{0,31}$/u", string) 
    and
    not match("/-$/", string))

   print "success!"

То есть сначала я проверяю, что строка имеет правильное содержимое, не с '-' и правильной длины, а затем я провожу еще один тест, чтобы убедиться, что она не оканчивается на '-'.

Есть предложения по объединению этого в одно регулярное выражение PCRE?

Я пытался использовать прогнозные утверждения, но не смог заставить его работать.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Попробуйте это регулярное выражение:

/^[\p{L}0-9](?:[\p{L}0-9-]{0,30}[\p{L}0-9])?$/u

А если вы хотите использовать осмотрительные утверждения:

/^[\p{L}0-9][\p{L}0-9-]{0,31}$(?<!-)/u
1 голос
/ 23 апреля 2010

Несколько альтернативным подходом было бы сохранить класс вашего персонажа в одной части и конкретизировать точки, в которых вы не хотите использовать дефис.

/^(?!-)[\p{L}0-9-]{1,32}(?<!-)$/Du

Также обратите внимание на модификатор D, о котором все всегда забывают.

Наконец, просто чтобы быть уверенным, вы знаете, что \pL будет соответствовать гораздо больше, чем a-zA-Z, верно? Просто проверяю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...