2013-06-04 8 views
2

Я новичок в регулярных выражениях. Я читал о регулярном выражении за последние пару часов, чтобы понять, как использовать регулярное выражение * для достижения следующего, но с небольшим удачей. Мой мозг начал болеть. Отсюда и призыв о помощи. Ниже приведены ограничения, которые я хочу применить к полю ввода данных, какое регулярное выражение следует использовать?Предельные входные данные

  1. Первый и последний символы должны быть буквенно-цифровыми, "." (т. е. точка) или «_» (т. е. подчеркивание)
  2. Символы между первым и последним символами могут быть буквенно-цифровыми, «.». (т. е. точка), «_» (т. е. подчеркивание) или «-» (то есть дефис)
  3. Символы «.» (т. е. точка) и «-» (то есть дефис) не могут появляться последовательно.
  4. На входе должно быть по крайней мере один буквенно-цифровой символ.

Некоторые действительно входные данные:

.abc_ 
__abc.d-e. 
.__a. 
.a__b. 
_a-b. 
abc 
a___. 

Спасибо и уважение,

~ Подключите

  • Я использую библиотеку третьей стороны, которая использует внутренне повысить-регулярное выражение для разбора выражение.
+1

Как это звучит сейчас, это выглядит как-то [код Морзе] (Http: //en.wikipedia.org/wiki/Morse_code) o_o Можете ли вы предоставить образец? – HamZa

+0

@HamZa Готово! Добавлено несколько примеров ввода текста. – user1937634

+0

Я не уверен, что это возможно с регулярным выражением. По крайней мере, не легко. –

ответ

2

Вы должны действительно показать, что вы показали до сих пор.

Тем не менее, регулярное выражение, чтобы покрыть ваши ограничения должны выглядеть немного как это:

^[a-zA-Z0-9\._](?:[a-zA-Z0-9_]*(?:\.(?!\.))*(?:-(?!-))*[a-zA-Z0-9_]*)*[a-zA-Z0-9\._]$ 

Кто-то может также прийти вместе с более хорошим отформатирован один, но он, кажется, работает в http://www.regex101.com/ за все я проверил это на.

+1

Я сделал вариацию вашего регулярного выражения, он обрабатывает правило 3 для первого и последнего символов, а также правило 4 (через положительный взгляд). '^ (? =. * [[: Alnum:]]) [[: alnum:] _.] (?: [[: Alnum:] _] | (? Hasturkun

+0

Вышеупомянутое регулярное выражение работает нормально, когда есть совпадение, но может легко перейти в [катастрофический откат] (http://www.regular-expressions.info/catastrophic.html), когда он не соответствует. то есть он имеет классическую форму: '^ (a * a *) * $', и когда применяется к строке '' aaaaaaaaaab, '' требует, чтобы многие, _many_ итерации объявляли ошибку совпадения. – ridgerunner

2

Это очень грязно, чтобы сделать с одним регулярным выражением. На самом деле это невозможно, но вы будете прыгать с сумасшедшими обручами, чтобы сделать это, чтобы вам было лучше писать машину состояний. Однако это легко сделать с помощью серии регулярных тестов.

Для ваших условий 1 и 2 текст должен соответствовать следующим (с учетом, что текст может быть длиной только один символ):

^([a-z0-9._]|[a-z0-9._][a-z0-9_.-]*[a-z0-9._])$ 

Для вашего состояния 3, текст должен не матча один из это регулярное выражение (выберите, если это необходимо, ваша спецификация не совсем ясна).

.*[.-][.-].* 
.*(.-|-.).* 
.*(\.\.|--).* 

Для вашего состояния 4, текст должен соответствовать следующим образом:

.*[a-z0-9].* 

я не допускается прописными буквами здесь. Добавьте их в шаблоны символов, если это необходимо.

0

Интересная проблема. Может быть разрешено с нетривиальным регулярным выражением. Здесь в синтаксисе Java (требуется регулярное выражение будет заключен в строке.)

Pattern re_valid = Pattern.compile(
    " # Regex to validate special word requirements.         \n" + 
    " ^       # Anchor to start of string. And...    \n" + 
    " (?=[A-Za-z0-9._])    # First char is alphanum, dot or underscore. And...\n" + 
    " (?=.*[A-Za-z0-9._]$)   # Last char is alphanum, dot or underscore. And... \n" + 
    " (?=[^A-Za-z0-9]*[A-Za-z0-9]) # Contains at least one alphanum.     \n" + 
    " (?:       # Group two possible content formats.    \n" + 
    "  [A-Za-z0-9_]+    # Case 1: Begins with one or more non-[-.].  \n" + 
    "  (?:       # Zero or more [-.] separated parts.    \n" + 
    "  [-.]      # Each part separated by one [-.],     \n" + 
    "  [A-Za-z0-9_]+    # followed by one or more non-[-.].    \n" + 
    "  )*       # Zero or more [-.] separated parts.    \n" + 
    "  [.]?      # May end with one [-.].       \n" + 
    " | [.]       # Or Case 2: Begins with hyphen or dot.   \n" + 
    "  (?:       # Zero or more [-.] separated parts.    \n" + 
    "  [A-Za-z0-9_]+    # One or more non-[-.],       \n" + 
    "  [-.]      # followed by one [-.].       \n" + 
    "  )*       # Zero or more [-.] separated parts.    \n" + 
    "  [A-Za-z0-9_]*    # May end with zero or more non-[-.].    \n" + 
    " )        # End group of two content alternatives.   \n" + 
    " $        # Anchor to end of string.       ", 
    Pattern.COMMENTS); 
+0

Для получения дополнительной надобности напишите его, чтобы он обрабатывал входные данные от начала до конца без возврата. – mc0e

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