Ich versuche, einen Regex-Test in JavaScript zu erstellen, der eine Zeichenfolge testet, die eines der folgenden Zeichen enthält:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Weitere Infos bei Interesse :)
Es ist für eine ziemlich coole Anwendung zum Ändern von Passwörtern, an der ich arbeite. Falls Sie interessiert sind, hier ist der Rest des Codes.
Ich habe eine Tabelle, in der die Kennwortanforderungen aufgeführt sind. Wenn Endbenutzer das neue Kennwort eingeben, wird ein Array von Regexes getestet und ein Häkchen in die entsprechende Tabellenzeile gesetzt, wenn ... ausgecheckt :) Ich muss nur dieses hinzufügen anstelle des 4. Elements im validation
Array.
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);
}
Ja, es gibt auch eine entsprechende serverseitige Validierung!
javascript
jquery
regex
Pixelbobby
quelle
quelle
.addClass("check")
und verwenden.removeClass("check")
? Und wenn ichif (someBoolean == true)
im Code sehe, erschrecke ich immer. Tu es einfachif (someBoolean)
. Oder besser noch$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Antworten:
Der reguläre Ausdruck dafür ist wirklich einfach. Verwenden Sie einfach eine Zeichenklasse. Der Bindestrich ist ein Sonderzeichen in Zeichenklassen, daher muss er an erster Stelle stehen:
Sie müssen sich auch den anderen Metazeichen für reguläre Ausdrücke entziehen.
Bearbeiten: Der Bindestrich ist etwas Besonderes, da er zur Darstellung einer Reihe von Zeichen verwendet werden kann. Dieselbe Zeichenklasse kann mit folgenden Bereichen vereinfacht werden:
Es gibt drei Bereiche. '$' bis '/', ':' bis '?' und '{' bis '~'. Die letzte Zeichenfolge kann nicht einfacher mit einem Bereich dargestellt werden :! "^ _` [].
Verwenden Sie eine ACSII-Tabelle , um Bereiche für Zeichenklassen zu finden.
quelle
\Q
und\E
arbeiten nicht in der JS RegExp Engine :(/^\Q.\E$/.test('Q+E'); // true
Der einfachste und kürzeste Weg ist, dies zu verwenden:
Es bedeutet: Alle Zeichen, die keine Ziffer oder ein englischer Buchstabe (
\W
) oder ein Leerzeichen (\S
) sind.Es ist vielleicht nicht so perfekt wie Jeffs Lösung, aber es ist viel einfacher und ich denke nicht, dass es sich in der Praktikabilität unterscheidet.
quelle
^
wird benötigt, wenn wir\w
und\s
in kleinen Buchstaben verwenden.w
oder draußens
, und da sich diese beiden nicht wirklich überschneiden, lässt es einfach alle Charaktere durch? (Also nichts filtern.)/[\W\S]/
) lässt alles durch. Eine genauere Darstellung dessen, worauf Amir meiner Meinung nach hinaus wollte, wäre[^\w\s]
. Im ersteren Fall lautet der reguläre Ausdruck "stimme mit allem überein, was nicht alphanumerisch ist ODER was kein Leerzeichen ist". Wie Sie bereits erwähnt haben, lassen Sie alles durch, da alphanumerische Zeichen keine Leerzeichen sind und umgekehrt. Letzterer sagt "stimme mit allem überein, was nicht alphanumerisch ist UND das kein Leerzeichen ist". Ausnahmen gelten natürlich, wenn akzentuierte Zeichen (wieÀ
) mit übereinstimmen[^\w\s]
.Antworten
Erläuterung
Dadurch wird eine negierte Zeichenklasse erstellt, die die Wortzeichen und Leerzeichen entfernt. Alles was übrig bleibt sind die Sonderzeichen.
\w
wählt alle "Wort" -Zeichen aus, die äquivalent[^a-zA-Z0-9_]
\s
sind. wählt alle "Leerzeichen" aus, die äquivalent zu sind[ \t\n\r\f\v]
Wenn Sie das
^
am Anfang der Klasse hinzufügen , müssen Sie keine der folgenden Optionen auswählen.quelle
quelle
RegExp
Konstruktor nicht, wenn Sie nur ein Regex-Literal verwenden können. Viel weniger Fluchtarbeit (von denen die meisten sowieso unnötig sind), und es ist auch effizienter.Ein einfacher Weg, dies zu erreichen, ist die negative Menge [^ \ w \ s]. Dies fängt im Wesentlichen:
Aus irgendeinem Grund funktioniert [\ W \ S] nicht auf die gleiche Weise, es wird keine Filterung durchgeführt. Ein Kommentar von Zael zu einer der Antworten liefert eine Erklärung.
quelle
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Ersetzen Sie alle letzteren aus einer beliebigen Sprache in 'A', und wenn Sie zum Beispiel alle Ziffern auf 0 setzen möchten:
quelle