Je me frappe la tête contre un mur. Je souhaite une regex qui correspond: chaîne vide, mais c'est une simplification; Dans mon application mais qui correspond toujours à y a-t-il un moyen plus simple de le faire, cela pourrait être étendu à (dire), A code>, AB code> et abc code>, mais pas AC code>. J'ai ceci, ce qui fonctionne: a code>, b code> et c code> sont en réalité des cours de caractères longs, donc je ne veux pas les répéter encore et encore. Peut-être que je ne regarde tout simplement pas la bonne façon. J'ai essayé ceci: p> ac code>. P> abcd code>, abcde code>, etc Abcde code>, je veux dire qu'il correspondrait à: String vide, A code>, AB code>, abc code>, abcd code> , abcde code>. Fondamentalement, un "commence par" regex. P> p>
4 Réponses :
Essayez cette expression régulière: Je pense que vous pouvez voir le modèle et développer-le pour Maintenant, chaque partie dépend de la pièce précédente ( b em> dépend de a em>, c em> dépend de b em>, etc.). p> p> abcd code> et abcde code> comme: < / p>
Cela pourrait échouer si c n'est pas en fait un seul caractère.
Merci. Je ne peux pas croire que je ne pensais pas simplement changer le groupement. Et ceci est facile à prolonger: ^ (A (b (c (d (e)?)?)?)?)?)? $ code>. Ce site est super rapide aussi, je suis allé prendre un café après avoir posté et il y avait déjà trois réponses correctes quand je suis revenu
Cela devrait le faire:
/^A(BC?)?$/
/^A(?:B(?:C)?)?$/ should do it.This is using the non-capturing group construct (?: xxx ) so as not to mess up any match capturing you may be doing.
Merci. Pour faire correspondre la chaîne vide que vous devriez correspondre au tout dans un autre (? ...)? Code>
@Jenni: Oui, un autre niveau de nidification devrait le faire.
Cela semble un peu extravagant, mais cela fonctionne pour les classes de caractères ainsi que les caractères.
(vous utiliseriez toujours index de si elle pouvait être exprimée en tant que chaîne.) p>
Vous avez l'habitude d'être Capable de modifier une regexp, mais maintenant, vous en avez besoin d'une nouvelle avec n'importe quel changement. P>
RegExp.prototype.extend= function(c){
var s= '', rx= this.toString();
rx= rx.replace(/(\W+)$/, c+'$1').replace(/^\/|\/$/g,'');
if(this.global) s+= 'g';
if(this.multiline) s+= 'm';
if(this.ignoreCase) s+= 'i';
return RegExp(rx, s);
}
String.prototype.longMatch= function(arr){
// if(this=='') return true;
var Rx= RegExp("^("+arr.shift()+")");
var i= 0, L= Math.min(s.length, arr.length),
M= this.match(Rx);
while(i< L){
if(!M) return false;
Rx= Rx.extend(arr[i++]);
M= this.match(Rx);
}
return M[0]==this;
}
var arr= ['A','B','C','D'];
var s= 'ABCD';// try various strings
alert(s.longMatch(arr));
De quelle manière voulez-vous l'étendre?
C code> ne peut pas être préconisé par unA code> ouA code> doit être suivi d'unB code>?Donc, vous voulez autoriser
abcd code> mais pasACD code> etabcde code> mais pasacdé code>?Désolé, j'ai clarifié comment je voulais dire qu'il soit étendu. C'est une sorte de "commence par" Regex que je suppose que je cherche vraiment.