Aktualisierung: 27.9.23 - Ich stoße IMMER NOCH auf dieses Problem.
Betrachten Sie das Folgende:
- Sie verwenden Angular reaktive Formen und nutzen einige integrierte Funktionen wie die vorgefertigten Validatoren.
-
Sie verwenden etwas Ähnliches wie das Folgende.
form.forEach((formField: any) => {
let validatorsArray = formField.validators?.reduce((validators: any, validator: any) => {
switch(validator.type){
case 'required':
validators.push(Validators.required);
break;
case 'pattern':
validators.push(Validators.pattern(new RegExp(validator.value)));
break;
wobei jeder Validator ein von mir auf unserem Server definiertes Objekt ist, wie z.B.:
{
"name": "kleinschreibungundunterstrich"
"value": "^[a-z_]*$",
"type": "pattern",
"error": "Spaltennamen dürfen nur Kleinbuchstaben und Unterstriche enthalten"
}
Man könnte annehmen, dass dies grundsätzlich mit reaktiven Formen funktionieren würde, aber das tut es nicht! Es fällt in dasselbe Loch wie der Beitrag von 2021 unten. Lass dich nicht täuschen!
Ich bin heute auf Folgendes gestoßen.
Merkwürdigerweise funktioniert folgendes:
form.forEach((formField: any) => {
let validatorsArray = formField.validators?.reduce((validators: any, validator: any) => {
switch(validator.type){
case 'required':
validators.push(Validators.required);
break;
case 'pattern':
validators.push(Validators.pattern(new RegExp(/^[a-z_]*$/)));
break;
Dies scheitert nicht jedes zweite Mal!
Aber wenn Sie eine Regex erstellen, die aus einer KLASSE stammt, indem Sie einen STRING verwenden... seien Sie vorsichtig. Sie müssen etwas wie das Folgende tun.
form.forEach((formField: any) => {
let validatorsArray = formField.validators?.reduce((validators: any, validator: any) => {
switch(validator.type){
case 'required':
validators.push(Validators.required);
break;
case 'pattern':
validators.push(this.testValue(validator));
break;
wobei Ihre testValue-Funktion folgendermaßen aussieht:
private testValue(validator: any): ValidatorFn {
return (control: AbstractControl) => {
let returnVal = null;
if(control.value){
//BEMERKEN Sie die Verwendung von Klammern um die RegExp unten.
if((new RegExp(validator.value, 'gm').test(control.value))){
return null;
} else {
return {[validator.name]: validator.error};
}
}
return returnVal;
}
}
Als ich heute daran gearbeitet habe, dachte ich ehrlich gesagt "sicher kann ich nicht dasselbe Problem mit Regexen haben...". Es stellte sich heraus, dass ich es hatte.
Es gibt etwas zu sagen jedes Mal, wenn Sie eine RegExp mit einem String erstellen. Wickeln Sie ihn einfach in Klammern. Aus irgendeinem Grund funktioniert es wie es sollte, wenn Sie es ohne ein Stringliteral erstellen.
Ich hoffe, das verdeutlicht diesen Punkt.
Im Grunde genommen verhalten sich Regexe anscheinend falsch, wenn sie aus Zeichenfolgenliteralen erstellt werden, und funktionieren scheinbar einwandfrei, wenn sie NICHT aus einer Zeichenfolge erstellt werden.
///Ende des Updates
Dies scheint immer noch ein Problem im August 2021 zu sein... Ich möchte nur einige Dinge teilen, die ich gelernt habe, bevor ich auf diese Frage und Antwort gestoßen bin. Ich war von diesem Problem verwirrt und hatte keinen sinnvollen Weg nach vorne - bis jetzt.
-
Es spielt keine Rolle, ob Sie exec()
oder test()
oder match()
verwenden. Die Regex funktioniert immer noch nicht richtig bei jedem zweiten Auftreten.
-
Es spielt keine Rolle, ob Sie die Regex mit
let reg = new RegExp(/]*)>/g);
oder mit const
festlegen. Es spielt auch keine Rolle, ob Sie sie global oder lokal festlegen...
Was wohl daran vorbeiführt, dieses Problem zu umgehen, ist das Einhüllen Ihrer Regex-Anweisung in Klammern in Ihrer Schleife, wie folgt:
Object.keys(table).forEach(key => {
if((new RegExp(/]*)>/g)).test(___Ihr Teststring___)){
//Tun Sie, was Sie tun müssen
}
});
Entfernen Sie die Klammern um die Regex, und beobachten Sie, wie jede andere fehlschlägt....
Vielen Dank für die Antwort @Nick Craver und den Kommentar @prototype!
Diese genaue Regex hat mir Probleme bereitet. Es hat für ein Objekt funktioniert und für das nachfolgende Objekt versagt, und das ergibt keinen Sinn. Ich bin nur hier, um zu sagen, dass dies auch 2021 sehr relevant ist.
0 Stimmen
Ersetzen Sie
id
durch etwas Statisches und sehen Sie, ob es funktioniert.1 Stimmen
Omg :-) scheint ein lustiger Fehler zu sein ...