118 votes

Regex pour faire correspondre les symboles : !$%^&*()_+|~-=`{}[] :";'<> ?,./

J'essaie de créer un test Regex en JavaScript qui testera si une chaîne contient l'un de ces caractères :

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

Plus d'informations si vous êtes intéressé :)

C'est pour une application de changement de mot de passe assez sympa sur laquelle je travaille. Au cas où vous seriez intéressés, voici le reste du code.

J'ai un tableau qui liste les exigences en matière de mot de passe et lorsque l'utilisateur final tape le nouveau mot de passe, il teste un tableau de Regex et place une coche dans la ligne correspondante du tableau s'il... se vérifie :) J'ai juste besoin d'ajouter celle-ci à la place du 4ème élément de la table validation de la gamme.

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

}

Oui, il y a aussi une validation correspondante côté serveur !

203voto

Jeff Hillman Points 3333

L'expression régulière est très simple. Il suffit d'utiliser une classe de caractères. Le trait d'union est un caractère spécial dans les classes de caractères, il doit donc être placé en premier :

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

Vous devez également échapper les autres métacaractères de l'expression régulière.

Editer : Le trait d'union est spécial car il peut être utilisé pour représenter une série de caractères. Cette même classe de caractères peut être simplifiée à l'aide d'intervalles :

/[$-/:-?{-~!"^_`\[\]]/

Il existe trois gammes. La dernière chaîne de caractères ne peut pas être représentée plus simplement par une plage : !"^_`[].

Utiliser un Tableau ACSII pour trouver des fourchettes pour les classes de caractères.

20voto

MikeSchem Points 347

Réponse

/[\W\S_]/

Explication

Cela crée une classe de caractères qui supprime les caractères de mot, les caractères d'espacement et ajoute le caractère de soulignement (car le soulignement est un caractère de "mot"). Il ne reste plus que les caractères spéciaux. Les lettres majuscules représentent la négation de leurs homologues minuscules.

\W sélectionnera tous les caractères non "mots" équivalents à [^a-zA-Z0-9_]
\S sélectionnera tous les caractères non "blancs" équivalents à [ \t\n\r\f\v]
_ sélectionnera "_" parce que nous l'annulons lorsque nous utilisons la fonction \W et qu'il faut l'ajouter à nouveau

15voto

AmirZpr Points 181

Le moyen le plus simple et le plus court d'y parvenir :

/[^\p{L}\d\s@#]/u

Explication

[^...] Correspondre à un seul caractère non présent dans la liste ci-dessous

  • \p{L} => correspond à n'importe quel type de lettre dans n'importe quelle langue

  • \d => correspond à un chiffre de zéro à neuf

  • \s => correspond à n'importe quel type de caractère invisible

  • @# \=> @ y # personnages

N'oubliez pas de passer le u (unicode).

1voto

Harfel Jaquez Points 209

Un moyen simple d'y parvenir est l'ensemble négatif [^ \w\s ]. Il s'agit essentiellement d'une capture :

  • Tout ce qui n'est pas un caractère alphanumérique (lettres et chiffres)
  • Tout ce qui n'est pas un espace, une tabulation ou un saut de ligne (collectivement appelé espace blanc).

Pour une raison ou une autre [ \W\S Le [ ] ne fonctionne pas de la même manière, il n'effectue aucun filtrage. Un commentaire de Zael sur l'une des réponses fournit une explication.

0voto

goldylucks Points 1436

Pour compléter la réponse de @jeff-hillman, voici la version complète

/[\\@#$-/:-?{-~!"^_`\[\]]/

Tests

function noSpecialChars(str) {
  const match = str.match(/[\\@#$-/:-?{-~!"^_`\[\]]/)
  if (!match) return

  throw new Error("got unsupported characters: " + match[0])
}

// prettier-ignore
const symbols = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", ".", ":", ";", "|","~","`","{","}","[","]","\"","'","<",">","?","/", "\\"]

symbols.forEach((s) => {
  it(`validates no symbol ${s}`, async () => {
    expect(() => {
      noSpecialChars(s)
    }).toThrow();
  })
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X