2013-05-05 4 views
0

Мне нужно регулярное выражение, которое может проверять строку в следующих критериях.Регулярное выражение (regex) в JavaScript

  • Начиная со стенографического текста ROLE_.
  • Допускается использование только заглавных букв и разрешений.
  • В нем должно быть не менее 6 символов и не более 20 символов.
  • Два или более последовательных символа подчеркивания запрещены.
  • Недопустимые ведущие и/или задние символы подчеркивания.
  • Текст ROLE_ADMIN запрещен.

Соответственно, следующее регулярное выражение работает на Java.

(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15}) 

Но в JavaScript, строка как ROLE_ADMIN_s (s в конце строчными) рассматривается как действительная строка, которая не должна быть на самом деле. Максимально допустимые символы (20) также не проверяются правильно.

Я использую функцию match() как,

if($("#txtAuthority").val().match("(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})")) 
{ 
    //... 
} 
+2

Вам нужно добавить '^' в начало и '$' до конца. Кроме того, это не ваша проблема, потому что браузер обрабатывает ее автоматически в этом случае, но вы должны обертывать регулярные выражения в '/ myexpression /' вместо '' myexpression '' – Dave

+0

:-) У меня были проблемы с обратным вызовом при переходе с js на java - добавление '. *' at start & end ... – anishsane

ответ

1

метод в Java matches ожидает шаблон, чтобы соответствовать всей строке, а метод в JavaScript match скорее найти совпадения метода, достаточно, чтобы шаблон находится где-то внутри строки.

"ROLE_ADMIN_s".match(/(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})/)[0] === "ROLE_ADMIN_" 

Если вы хотите в JavaScript match действовать как matches Java, используйте дюбели для начинать (^) и конец ($) строки:

/^(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})$/ 

Это потерпит неудачу на вашей строке:

"ROLE_ADMIN_s".match(/^(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})$/) === null 
+0

'/^(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15 }) $/'вычисляет значение false в допустимых строках типа -' ROLE_ADMIN_S'. – Tiny

+0

Это работает, когда я удаляю косую черту '/' с обеих сторон выражения типа '^ (?!. * __. *) (?!^ROLE_ADMIN $) (?!. * _ $) (ROLE_ [A- Z _] {1,15}) $ '. Я не понимаю это правильно. – Tiny

+0

@Tiny В JavaScript объекты '' RegExp' имеют литеральный синтаксис, который является '/ /'] (https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/RegExp). Конечно, если вы используете эти литералы как строку, то есть ''// "', разделители '/' также рассматриваются как часть шаблона. – Gumbo

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