J'ai besoin d'une regex qui teste une chaîne pour un p>
a-za-z0-9 #,.-_ code> li>
- minimum de 6 lettres dans ce 14 li>
- Minimum de 2 numéros dans ce cadre 14 LI>
ul>
Y a-t-il une manière que je puisse envelopper cela dans une expression régulière (actuellement, j'ai une fonction JavaScript et PHP qui fait trois tests distincts, celui qu'il est total, un autre qu'il y a au moins deux chiffres, et un autre que Il y a au moins 6 lettres. P>
alors ce qui suit serait valide: p>
- blabla2bla2f54a (valide> 14 total, avec au moins 6 lettres, au moins 2 numéros) li>
- ivisnotvalidatall (invalide parce que moins de 2 numéros) li>
ul>
4 Réponses :
blabla2bla2f54a (1) thisIsNotValidAtAll (0)
Si celles-ci sont {2,}, {6,}, et {14,} depuis son "ou plus"? Cela utilise la syntaxe if-then-else, non? régulier-expressions.info/conditional.html
@webarto semble très proche, mais ne fonctionne pas pour aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa fait du travail pour aaa2aaaaaaaaaaaaaa22aaaaaaaaaa22aaa code>. Il semble que l'aspect positif à venir exige qu'il y ait 2 séquences?
Donnez-moi une minute, je vais le comprendre :)
@Chris, oui il regarde dans la séquence, je ne peux pas le faire fonctionner non séquentiel s'il est possible du tout.
@webarto Merci d'avoir regardé dans cela, on dirait que vous étiez vraiment proche! Il semble que Ridghingunner a une place à peu près sur.
Je recommanderais plusieurs chèques, écrire une seule regex pour cela serait laid. Les chèques multiples vous permettent également de savoir quels critères n'ont pas été remplis.
$input = 'blabla2bla2f54a';
$errors=array();
if (!preg_match('/^[A-Za-z0-9#,.\-_]*$/', $input))
$errors[] = 'Invalid characters';
if (strlen($input) < 14)
$errors[] = 'Not long enough';
if (strlen(preg_replace('/[^0-9]/','',$input)) < 2)
$errors[] = 'Not enough numbers';
if (strlen(preg_replace('/[^A-Za-z]/','',$input)) < 6)
$errors[] = 'Not enough letters';
if (count($errors) > 0) //Didn't work
{
echo implode($errors,'<BR/>');
}
Non, ce n'est pas possible, car en fait, vous voulez faire trois contrôles individuels. Vous ne pouvez pas les envelopper dans une seule expression qui retourne vrai ou faux. Le problème est que vous avez deux contrôles égaux que vous auriez besoin de combiner via un opérateur et un opérateur, ce qui n'est pas possible. Mais ce que nous pouvons faire est de construire une regex de super taille qui reconnaît chaque cas possible. Mais le type de chapeau de regexp est insensé, car il prendrait beaucoup de temps pour appliquer ce test sur votre chaîne. Je vous recommanderais de faire trois tests séparés:
var result = string.replace(/[A-Za-z]{6}/, "").replace(/[0-9]{2}/, "").replace(/[A-Za-z0-9#,\.\-]{6}/, "").length == 0 ? true : false; // By shortening our sting we're saving time on later chained replacement methods
Oh désolé, totalement oublié l'utilisation de (? = ...). C'est possible. Webarto a raison.
facile! Premièrement, regardez une version commentée dans PHP:
var re = /^(?=(?:[^A-Za-z]*[A-Za-z]){6})(?=(?:[^0-9]*[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
@Ridgerunner j'aime bien, et je le comprends à peu près. Je vais devoir faire un peu plus de lecture sur un regard positif à venir, je pense. Une question cependant, pourquoi est-ce un minimum de 2/6 fait comme {2} / {6}, pas {2,} / {6,}?
@Cris: étant donné que chaque exigence n'est qu'un minimum, une fois que le nombre minimal est égalé, il n'est plus nécessaire de faire correspondre plus (alors pourquoi déranger - juste un travail supplémentaire inutile).
@Ridgerunner - Une seule question de plus, inclure # ,.-_ code> selon la question, j'aurais juste besoin de les inclure dans la clause finale [A-ZA-Z0-9 # , \.--_] {14,0} code>, correct?
@ridgerunner, est-il possible de correspondre à #,.-_ code> 0 ou plusieurs fois :)?
Presque, vous devez échapper au caractère - code> car il est utilisé pour spécifier des gammes. donc [a-za-z0-9 # ,. \ -_] {14,} code>
David est correct. Le - doit être échappé dans une classe de char (sauf si vous ne le placez au début ou à la fin). Personnellement, j'aime m'échapper. Ont mis à jour la réponse.
@David @ridgerunner, vous avez raison, si - code> n'est pas échappé puis ? code> peut passer à travers.
@Ridgerunner, @David, @webarto Merci de l'avoir discuté et de la déplacement du problème à la main. Je suis très heureux avec Ridghingunners Répondre et je vais marquer son aussi correct. Merci Ridge
@ridgerunner Je vois que vous avez supprimé l'étoile paresseuse, vous devriez probablement le remettre en arrière car il sauve beaucoup de backtracking et accélère beaucoup de choses. Voici une TESTCASE montrant la différence: JSPERF.com/regexQuestionMarkTest
@David: Tu as raison. Je laisse une version précédente glisser sur l'une de mes modifications. Merci pour l'oeil d'aigle!
Est-ce possible dans JavaScript? Mon intestin pense que cela est possible dans Perl. Regarder l'avenir Syntaxe pour une expression régulière peut-être ???
Gardez votre solution de travail. La compactage de cela en une regex n'est guère faisable sans expliquer le contenu requis comme permutations. Les affirmations dans le pcre tombent à plat parce qu'ils doivent être une longueur fixe.
Hmmmm, intéressant. Je suis raisonnablement à l'aise avec des expressions régulières, mais je pensais juste que je manquais quelque chose - qu'il y avait une solution que je ne voyais tout simplement pas. On dirait qu'il n'y aurait peut-être pas, ou pas viable
Cela se fait facilement dans une seule regex JavaScript. Voir ma réponse ci-dessous ...
Dupliqué possible de PHP Expression régulière: la chaîne doit contenir des types des personnages