2013-07-23 4 views
1

Я хочу создать регулярное выражение для следующей строкиRegular Expression застрял

abc.xy9.aBBB-hhh7.abcDD_XYz 

То есть,

  • Первый символ должен быть строчная
  • Последний символ должен быть буква/номер
  • между [A-Za-z0-9-_] и a .

Но входная строка содержит не менее 3 символов и не более 63 символов. Пожалуйста, проверьте приведенное ниже выражение

^((\\.?([a-z]{1})([A-Za-z0-9_-]*)([a-z0-9]{1}))*){3,63}$ 
+0

И чем вопрос, и как это связано с C++? – Danstahr

+0

Всегда ли это 4 группы или должно быть динамичным - вам также нужны группы захвата для использования после этого, или это чисто проверка правильности – SmokeyPHP

+0

Да, его динамическая, но не более 63 символов, Ex: abc.ab9.aBBBt-gga. abb_fff9 – Rono

ответ

1
^(([a-z][A-Za-z0-9_-]+[a-z0-9]\.)+[A-Za-z0-9_-]*[a-z0-9]|[a-z][A-Za-z0-9_-]+[a-z0-9])$ 

Если он совпадает, то проверить длину (например, в PHP preg_match проверка возвращает> 0, а затем проверить общую длину с STRLEN).

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

+0

Я пробовал, но не мог понять мое ожидаемое поведение. Ваше предположение было правильным, «.» разделенное каждым словом типа «abc.ab9.aCCddF9.ayyyqTT_jj-a» – Rono

+0

@Rono это выражение отлично работает для меня - в чем проблема? – SmokeyPHP

+0

Попробуйте aBBBa, его не удалось – Rono

0

Не совсем. См., {3,63} в конце применяется к регулярному выражению в целом - он будет применять все регулярное выражение 63 раза. Вместо этого попробуйте поместить это в свой внутренний класс символов. Кроме того, я не думаю, что вам нужен период в начале, вы хотите его в своем классе персонажа, и говорит, что {1} является избыточным.

^((([a-z])([A-Za-z0-9_-.]{1,61})([a-z0-9])))$ 
+1

Если нет необходимости захватывать группы, вы можете удалить все скобки в этом выражении. Даже в скобках у вас есть два набора скобок снаружи, поэтому вы можете удалить один набор и по-прежнему захватывать одни и те же группы. Кроме того, будьте осторожны с '-' внутри класса символов. Ваше текущее выражение говорит '_ через .' использовать' \ -' в этом случае. – Shaz

+0

Моя ожидаемая строка вроде этого a.. разделенные каждым словом Ex: "abc.ab9.aCCddF9.ayyyqTT_jj-a" – Rono

1

Вы уже дали описание:

Первый символ является маленькой буквы: [a-z] Последний небольшой Летте или номер: [a-z0-9] Inbetween: [A-Za-z0-9-_. ]

Не менее 3 символов, не более 63 означает, что yu должно повторять среднее регулярное выражение от 1 до 61 раз.

Вместе:

[a-z][A-Za-z0-9_.-]{1,61}[a-z0-9] 

Однако: Вам нужно что-то отличное от букв и цифр, покрывающей вашу строку. Без этого, это регулярное выражение делает матч, например:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Это происходит потому, что регулярное выражение может найти 63 «а-х и претендовать на матч.

+0

Просто быть педантичным, но вы можете избежать последнего '-' в своем выражении. В зависимости от того, как анализируется регулярное выражение, он может интерпретировать класс символов '9-_', который содержит такие символы, как' []^'Некоторые парсеры будут работать, потому что он будет игнорировать 9, поскольку он находится в другой группе символов,' 0-9 ', но это не всегда так. – Shaz

+0

Конечно, я просто поставлю - на конце. – Ingo

+0

Thx bro "Ingo" для ответа. У меня есть несколько уточнений в запросе. То есть; строка ввода abc.xTTTT-jj-a.aHHH7 это моя ожидаемая строка ввода, ее следует оценить, но ее никогда не превышало 63 символа. Также каждое слово разделяется символом «.». – Rono