6
votes

Expression régulière pour correspondre à A, AB, ABC, mais pas AC. ("commence avec")

Je me frappe la tête contre un mur. Je souhaite une regex qui correspond: chaîne vide, A , AB et abc , mais pas AC . J'ai ceci, ce qui fonctionne: xxx

mais c'est une simplification; Dans mon application a , b et c 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: xxx

mais qui correspond toujours à ac .

y a-t-il un moyen plus simple de le faire, cela pourrait être étendu à (dire), abcd , abcde , etc Abcde , je veux dire qu'il correspondrait à: String vide, A , AB , abc , abcd , abcde . Fondamentalement, un "commence par" regex.


4 commentaires

De quelle manière voulez-vous l'étendre?


C ne peut pas être préconisé par un A ou A doit être suivi d'un B ?


Donc, vous voulez autoriser abcd mais pas ACD et abcde mais pas acdé ?


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.


4 Réponses :


13
votes

Essayez cette expression régulière: xxx

Je pense que vous pouvez voir le modèle et développer-le pour abcd et abcde comme: < / p> xxx

Maintenant, chaque partie dépend de la pièce précédente ( b dépend de a , c dépend de b , etc.).


2 commentaires

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)?)?)?)?)?)? $ . 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



4
votes

Cela devrait le faire:

/^A(BC?)?$/


0 commentaires

6
votes
/^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.

2 commentaires

Merci. Pour faire correspondre la chaîne vide que vous devriez correspondre au tout dans un autre (? ...)?


@Jenni: Oui, un autre niveau de nidification devrait le faire.



0
votes

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));


0 commentaires