Подтвердить что ты не робот

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);

}

Да, есть также проверка на стороне сервера!

4b9b3361

Ответ 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?'&lbrack;[[${r.roll}]]&rbrack;':''}'];
        }
      }
    });

    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");