2013-07-31 5 views
16

ich eine Anforderung haben, die den regulären Ausdruck nicht mehr als 2 gleichen Buchstaben/Ziffer in xsl Dateiregulären Ausdruck für nicht mehr als 2 wiederholt Buchstaben/Ziffern

-no space 
-does not support special chars. 
-support (a-z,A-Z,0-9), 
-require one of a-z, 
-require one of 0-9, 
-no more than 2 same letter/digits (i.e BBB will fail, BB is accepted) 

behandeln müssen, was ich habe bisher

(?:[^a-zA-Z0-9]{1,2}) 
+0

Ist es _have_ ein regulärer Ausdruck sein, oder könnte eine Funktion, die wahr oder falsch zurückgibt OK sein? –

+1

Was ist mit 'AABAA'? – HamZa

+0

@Bryan Oakley: Ich habe eine Funktion, um zu überprüfen, ob die Variable der Regex entspricht.welche geben wahr oder falsch zurück –

Antwort

1

Als Antwort auf eine Klarstellung scheint es, dass ein einzelner regulärer Ausdruck nicht unbedingt erforderlich ist. In diesem Fall schlage ich vor, dass Sie mehrere reguläre Ausdrücke oder Funktionen verwenden. Meine Vermutung ist, Leistung ist keine Voraussetzung, da diese Art von Prüfungen in der Regel als Reaktion auf Benutzereingaben durchgeführt werden. Die Validierung der Benutzereingabe kann 100 ms dauern und trotzdem augenblicklich angezeigt werden, und Sie können einen Los Code in 100 ms ausführen.

Zum Beispiel würde ich persönlich für jeden Ihrer Bedingungen in einem separaten Test überprüfen. Zuerst nach Leerzeichen suchen. Zweitens, überprüfe mindestens einen Buchstaben. Als nächstes nach mindestens einer Nummer suchen. Suchen Sie abschließend nach Feldern mit drei oder mehr Wiederholungen.

Ihr Code wird viel einfacher zu verstehen sein, und es wird viel einfacher sein, die Regeln später zu ändern (was, wie die Erfahrung gezeigt hat, mit ziemlicher Sicherheit passieren wird).

Zum Beispiel:

function do_validation(string) { 
    return (has_no_space(string) && 
      has_no_special_char(string) && 
      has_alpha(string) && 
      has_digit(string) && 
      ! (has_repeating(string))) 

Ich persönlich halte die oben Größenordnung leichter zu lesen als eine komplexe reguläre Ausdrücke. Wenn Sie eine Regel hinzufügen oder entfernen, müssen Sie einen komplexen regulären Ausdruck nicht erneut implementieren (und müssen daher alle möglichen Kombinationen erneut testen).

+0

wieder, danke, aber wie ich jetzt handle ist mit anderen zu nähern, nicht wollen, meine Datei viel zu bauen –

11

für dasselbe Zeichen passend wiederholt 3 oder mehr Male hintereinander, versuchen:

([a-zA-Z0-9])\1{2,} 

Musterübereinstimmungen (getestet sowohl here und here): AABBAA (keine Übereinstimmungen), AABBBAAA (entspricht BBB und AAA), ABABABABABABABA (keine Treffer), ABCCCCCCCCCC (entspricht CCCCCCCCCC).

+0

War gerade dabei, dies zu buchen! Beat mich dazu! – SmokeyPHP

+0

dies erfordert nicht mindestens eine Ziffer und ein char –

+0

@Racso: das ist gut, aber nicht alle meine Anforderung –

22

Diese Regex wird es tun: ^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$

Hier ist der Zusammenbruch:

(?!.*([A-Za-z0-9])\1{2}) stellt sicher, dass keine der Zeichen mehr wiederholen als zweimal in einer Reihe.

(?=.*[a-z]) benötigt mindestens einen Kleinbuchstaben

(?=.*\d) erfordert mindestens eine Ziffer

[A-Za-z0-9]+ nur Buchstaben und Ziffern

EDIT erlaubt: entfernt ein Fremd .* von der negativen Look-Ahead-

+0

Ich teste die Regex und es stimmt nicht mit Zeichenfolgen wie' A1D3E' (gültig) oder 'AAAA' (ungültig) überein. – Racso

+2

@Rasco: Kleinbuchstabe ist erforderlich, daher ist'A1D3E' ungültig. –

+0

@Brian Stephens, das funktioniert gut wie jetzt, ich habe mehrere Fälle getestet, müssen weitere Tests zu –

2

Sie können dies in 2 Regexes tun:

  1. /^(?=.*[a-z])(?=.*[0-9])[a-z0-9]+$/i Dadurch wird sichergestellt, dass es mindestens 1 Stelle und 1 Buchstaben ist, während nur Buchstaben und Ziffern (ohne Leerzeichen oder Sonderzeichen)
  2. /([a-z0-9])\1{2,}/i akzeptieren Wenn dies ein abgestimmt ist, dann gibt es ein wiederholtes Zeichen. Was bedeutet, dass Sie false werfen sollten.

Erläuterung:

Erste regex:

  • ^: entsprechen der Linie beginnen
  • (?=.*[a-z]): überprüfen, ob es mindestens einen Buchstaben ist
  • (?=.*[0-9]): überprüfen, ob es ist mindestens eine Ziffer
  • [a-z0-9]+: wenn die Kontrollen wahr wäre, dann nur entsprechen Ziffern/Buchstaben ein- oder mehrmals
  • $: match Zeilenende
  • i: Modifikator, match Groß- und Kleinschreibung

Zweite regex:

  • ([a-z0-9]): Spiel und Gruppe eine Ziffer oder ein Buchstabe
  • \1{2,}: Spiel der Gruppe 1 zwei oder mehr Male
  • i: Modifikator, match Groß- und Kleinschreibung
+0

irgendwie, Xsl-Datei mag nicht wirklich /, Ich weiß nicht warum –

+0

@cool_spirit Dann verwenden Sie '(? I)^(? =. * [Az]) (? =. * [0-9]) [a-z0- 9] + $ 'und' (? I) ([a-z0-9]) \ 1 {2,} 'stattdessen. Ich nahm an, dass dies reines JS ist ... – HamZa

3

Ist dies eine Arbeit für Sie?

/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/ 

Ausprobieren:

var regex = new RegExp(/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/) 
var tests = ['A1D3E', 'AAAA', 'AABAA', 'abccddeeff', 'abbbc', '1234'] 

for(test in tests) { 
    console.log(tests[test] + ' - ' + Boolean(tests[test].match(regex))) 
} 

Will Ausgang:

A1D3E - true 
AAAA - false 
AABAA - true 
abccddeeff - true 
abbbc - false 
1234 - true 
+0

Upvoting, ... Obwohl es die Anforderungen des OP nicht erfüllt, erfüllt es die Anforderungen, die ich habe, danke. – Wranorn

Verwandte Themen