2010-04-23 1 views
2

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

Я использую регулярные выражения 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

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

/^[\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 
+0

Первое предложение хорошее и, кажется, передает все мои тесты, спасибо! Кстати, знаете ли вы, есть ли какие-то причины предпочесть друг другу? – shevron

+0

@Shahar Evron: Существует реализация регулярных выражений, которые не поддерживают утверждения, основанные на взгляде или утверждениях вокруг взгляда. В таком случае хорошо знать альтернативу. – Gumbo

1

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

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

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

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

+0

Да, я знаю об этом, поэтому я его использую :) – shevron

Смежные вопросы