2016-05-16 1 views
1

Я использую jQuery для добавления атрибута pattern в текстовое поле на основе буквы, которую я выбираю из массива. Я пытаюсь ограничить значения, которые текстовое поле может принимать с помощью регулярного выражения, но оно работает неправильно.Регулярное выражение для совпадения первого символа и не более двух одинаковых последовательностей

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

Моего регулярное выражение это:

^["+letter+"](?!(.)\1).{2}.* 

И это, кажется, работает, когда я тестирую его в regexr.com, но когда я проверить его на моей странице, только часть матча 1-го полукокс работы , а остальные нет. Когда я печатаю что-то вроде «Aaaaron», сообщение «invalid entry» не отображается.

Заранее спасибо.

+0

Возможно, он работает в онлайн-тесте регулярного выражения, потому что вы включили флаг '/ i'? –

ответ

1

Описание

^(.)(?!\1{2}) 

Regular expression visualization

Это регулярное выражение будет делать следующее:

  • захватить первый символ
  • Сверяет первый символ затем не повторяется еще 2 раза. Если после первого появления присутствуют еще два одинаковых символа, у вас есть 3 одинаковых символа в строке.

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

Живой пример

https://regex101.com/r/xG9mE9/2

Объяснение

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of a "line" 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    .      any character except \n 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    (?!      look ahead to see if there is not: 
---------------------------------------------------------------------- 
    \1{2}     what was matched by capture \1 (2 times) 
---------------------------------------------------------------------- 
)      end of look-ahead 
---------------------------------------------------------------------- 
1

попробовать это регулярное выражение: (с буквой быть 'а')

$("form").find("input[type=text]").attr("pattern", "(?=[Aa])(?!.*(.)\\1\\1).*"); 

он проверяет исходное письмо, и что ни один символ не появляется более двух раз подряд:

jsfiddle

ноты:

  • вам can't do case insensitive matching с HTML5 атрибута шаблона, так что 'в' и 'А' не одно и то же ('Aaaron' это не 3 а х в ряд)
  • Если вы добавляете шаблон через строку (не литерал регулярного выражения) в jquery/javascript, помните, что сначала была интерполяция строк, а затем интерполяция интервала регулярного выражения (обратная косая черта означает что-то в String также и в Regex, вам может потребоваться удвоить их: (\\1 для обратной ссылки в этом случае)
  • Вам не нужно ^ или $, чтобы входное значение соответствовало только всему шаблону, регулярное выражение обернуто в ^(?:regex)$ для вас.Это означает, что если ваш шаблон не потребляет всю строку, он не будет работать: (?=[Aa])(?!.*(.)\\1\\1), которые являются всего лишь несколькими поисковыми окнами и обычно проверяют ввод как раз тонким, представляет собой шаблон с нулевой шириной и без .* на конец, не работает.
+0

По-прежнему не отображается сообщение о недопустимой записи, но это кажется правильным регулярным выражением. Вы знаете, что может быть причиной? Я использую валидатор HTML5 + CSS3 (input: valid, input: invalid), но сообщение отображается только при первом вводе неправильной буквы, но не тогда, когда я печатаю последовательные идентичные значения. –

+0

Вы можете создать https://jsfiddle.net/, иллюстрирующий ошибку? (вы можете добавить jquery как внешнюю lib) – sweaver2112

+0

Здесь: https://jsfiddle.net/dv1avz5q/ –

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