Regex to Match Symbols:! $% ^ & *() _ + | ~ - = `{} []:"; '<>?,./
Я пытаюсь создать тест Regex в JavaScript, который проверит строку, содержащую любой из этих символов:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Дополнительная информация Если вас интересует:)
Это для довольно классного приложения для изменения пароля, над которым я работаю. Если вас интересует здесь остальная часть кода.
У меня есть таблица, в которой перечислены требования к паролю, а в качестве конечных пользователей - новый пароль, он проверит массив регулярных выражений и пометит галочку в соответствующей строке таблицы, если он... проверяет:) Мне просто нужно добавьте это вместо 4-го элемента в массиве validation
.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Да, есть также проверка на стороне сервера!
Ответы
Ответ 1
Регулярное выражение для этого действительно просто. Просто используйте класс символов. Дефис - это особый символ в классах символов, поэтому он должен быть первым:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/
Вам также нужно избежать других метасимволов регулярных выражений.
Edit:
Дефис является особенным, потому что его можно использовать для представления диапазона символов. Этот же класс символов можно упростить с помощью диапазонов:
/[$-/:-?{-~!"^_`\[\]]/
Существует три диапазона. '$' to '/', ':' to '?' и '{' to '~'. последняя строка символов не может быть представлена более просто с помощью диапазона:! "^ _` [].
Используйте таблицу ACSII, чтобы найти диапазоны для классов символов.
Ответ 2
Самый простой и краткий способ - использовать это:
/[\W\S]/
Это означает: все символы, которые не являются цифрой или английской буквой (\W
) или символом пробела (\S
).
Возможно, он не так совершенен, как решение Джеффа, но гораздо проще, и я не думаю, что он отличается практичностью.
Ответ 3
У меня похожая проблема. Я пытаюсь создать сценарий, который распознает конкретные шаблоны, некоторые из которых содержат специальные символы.
Мне нужно сделать две вещи. Мод используется как var dtype в инструкции switch и отправляется в чат. В настоящее время он удаляет + из pi+ & pi+ +.
on('ready',()=>{
const getRollData = (text) => {
const regex = {
roll: /^\d+d/,
frag: /^\[([^\]]*)\]/,
armorDiv: /\(((?:0\.)?\d+)\)/,
mod: /(aff|burn|cor|cr|cor|cut|ex|fat|imp|inc|pi-|pi|pi\+|pi\+\+|rad|sur)(?:\[([^\]]+)\])?/
};
let p = [];
let b = false;
let accu='';
text.split('').forEach(c=>{
if(/\[/.test(c)){
b=true;
}
if(/\]/.test(c)){
b=false;
}
if(!b && /\s/.test(c)){
if(accu.length){
p.push(accu);
}
accu='';
} else {
accu+=c;
}
});
p.push(accu);
let roll = {};
p.forEach(t=>{
if(regex.frag.test(t)){
let m = t.match(regex.frag);
roll.frag = getRollData(m[1]);
} else if(regex.roll.test(t)){
let m = t.match(regex.armorDiv);
if(m){
roll.armorDiv = m[1];
t = t.replace(regex.armorDiv,'');
}
t = t.replace(/d/,'d6');
t = t.replace(/[x¥]/g,'*');
roll.roll = t;
} else {
let m = t.match(regex.mod);
if(m) {
let r={};
if(m[2]){
r=getRollData(m[2]);
}
roll.damageTypes = [...(roll.damageTypes||[]),'${m[1]}${r.roll?'[[[${r.roll}]]]':''}'];
}
}
});
return roll;
};
const fmtRoll = (rd) => '${rd.roll ? '[[${rd.roll}]] ' :''}${rd.armorDiv ? 'Armor Div: ${rd.armorDiv} ' : ''}${rd.damageTypes ? 'Damage Mods: ${rd.damageTypes.join(' ')} ':''}${rd.frag ? 'Frag Damage: ${fmtRoll(rd.frag)}' : ''}';
on('chat:message', (msg)=>{
if('api'===msg.type && /^!frag\b/i.test(msg.content)){
let rd = getRollData(msg.content.replace(/^!frag\s+/i,''));
sendChat(msg.who, fmtRoll(rd));
}
});
});
Ответ 4
Простой способ добиться этого - отрицательный набор [^\w\s]. Это по сути ловит:
- Все, что не является буквенно-цифровым символом (буквы и цифры)
- Все, что не является пробелом, табуляцией или разрывом строки (вместе именуемые пробелами)
По какой-то причине [\ W\S] не работает так же, не выполняет никакой фильтрации. Комментарий Заэля к одному из ответов дает что-то вроде объяснения.
Ответ 5
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict
const hasSpecial = password => {
const specialReg = new RegExp(
'^(?=.*[[email protected]#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+'~\\:;,\\.€\\|])',
);
return specialReg.test(password);
};
Ответ 6
Замените все ребра из любого языка в 'A', и если вы хотите, например, все цифры до 0:
return str.replace(/[^\[email protected][-`{-~]/g, "A").replace(/\d/g, "0");