2016-06-17 3 views
0

Я пытаюсь построить регулярное выражение, которое позволяет использовать следующие символы:Допустимые символы Regex (JavaScript)

A-Z 

a-z 

1234567890 

[email protected]#$%&*()_-+={[}]|\:;"'<,>.?/~` 

Все остальные символы являются недействительными. Это регулярное выражение, которое я построил, но оно не работает, как я ожидаю. Я ожидаю, что .test() возвращает ложь, когда неверный символ присутствует:

var string = 'abcd^wyd'; 

function isValidPassword() { 
    var regex = /[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]+[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]*/g 
    return regex.test(string); 
} 

В этом случае тест всегда возвращается «истина», даже если «^» присутствует в строке.

+0

определение не работает как ожидалось .. – rock321987

+0

@ рок321987 посмотрите пожалуйста обновленный вопрос. – developthewebz

+2

Вы не привязываете шаблон к началу/концу. – PeeHaa

ответ

2

Ваше регулярное выражение проверяет наличие хотя бы одного из допустимых символов. Добавить начальные и конечные якоря в свое регулярное выражение - /^...$/

var string = 'abcd^wyd'; 

function isValidPassword() { 
    var regex = /^[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]+[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]*$/g 
    return regex.test(string); 
} 

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

// return true if string does not (`!`) match a character that is not (`^`) in the set... 
return !/[^[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]/.test() 
+0

дополнительно, второй набор символов не требуется, поскольку он учитывается в первом повторителе.'+' - один или несколько, а '*' равно нулю или больше, поэтому один или несколько из набора, за которым следуют ноль или более одного и того же набора, функционально эквивалентны только одному или нескольким из набора. –

+0

Отлично. Большое спасибо! Я забыл закрепить шаблон. – developthewebz

-1

Регулярное выражение, как вы написали, проверяет наличие символов во входной строке независимо от того, где она появляется.

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

Добавив ^ и $, вы инструктируете ваше регулярное выражение соответствовать только допустимым символам для всей строки, а не любому подразделу.

var string = 'abcd^wyd'; 
function isValidPassword() { 
    var regex = /^[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]+[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]*$/g 
    return regex.test(string); 
} 
+1

Забавно, как ваша функция не принимает аргументов ... –

+0

@PatrickRoberts Да, оригинальная реализация OP использует переменную вне определения функции. – Alan

-1

Ваше регулярное выражение соответствие первой части O = вашу строку, т.е. «ABCD», так это верно. Вы должны закрепить его на начало (с использованием^в начале) и конец строки (используя $ в конце), так что ваше регулярное выражение должно выглядеть следующим образом:

^[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]+[[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]$ 

Таким образом, он должен будет соответствовать целая строка.

Вы можете визуализировать его в следующей ссылке:

regexper_diagram

-1

Это регулярное выражение будет работать.

var str = '[email protected]#$%&*()_-+={[}]|:;"\'<,>.?/~\`'; 
var reg = /.|\d|!|@|#|\$|%|&|\*|\(|\)|_|-|\+|=|{|\[|}|]|\||:|;|"|'|<|,|>|\.|\?|\/|~|`/gi; 

// test it. 

reg.test(str); //true 

Я использую этот сайт для проверки своего регулярного выражения. Regex 101

0

Вместо поиска разрешенных символов поиск запрещенных.

var string = 'abcd^wyd'; 

function regTest (string) {//[^ == not 
    var regex = /[^[email protected]#$%&*()_\-+={[}\]|\:;"'<,>.?\/\\~`]/g 
    return !regex.test(string);//false if found 
} 

console.log(regTest(string)); 
Смежные вопросы