Регулярное выражение для соответствия A, AB, ABC, но не AC. ("начинается с") - PullRequest
3 голосов
/ 05 января 2010

Я бьюсь головой о стену. Я хочу регулярное выражение, которое соответствует: пустая строка, A, AB и ABC, но не AC. У меня есть это, которое работает:

/^(A|AB|ABC)?$/

Но это упрощение; в моем приложении A, B и C - это классы длинных символов, поэтому я не хочу повторять их снова и снова. Может быть, я просто не смотрю на это правильно. Я попробовал это:

/^((AB?)C?)?$/

Но это все равно соответствует AC.

Есть ли более простой способ сделать это, который можно расширить, скажем, до ABCD, ABCDE и т. Д.? * 10101 *

Редактировать : под расширением до ABCDE я имею в виду, что оно будет соответствовать: пустая строка, A, AB, ABC, ABCD, ABCDE. По сути, регулярное выражение "начинается с".

Ответы [ 4 ]

9 голосов
/ 05 января 2010

Попробуйте это регулярное выражение:

^(A(B(C)?)?)?$

Я думаю, вы можете увидеть шаблон и развернуть его для ABCD и ABCDE, например:

^(A(B(C(D)?)?)?)?$
^(A(B(C(D(E)?)?)?)?)?$

Теперь каждая часть зависит от предыдущих частей ( B зависит от A , C зависит от B и т. Д.).

5 голосов
/ 05 января 2010
/^A(?:B(?:C)?)?$/

должен это сделать.

При этом используется групповая конструкция без захвата (?: xxx ), чтобы не мешать захвату ваших совпадений.

4 голосов
/ 05 января 2010

Это должно сделать это:

/^A(BC?)?$/
0 голосов
/ 05 января 2010

Это выглядит немного экстравагантно, но работает как для классов персонажей, так и для персонажей.

(Вы всегда будете использовать indexOf, если он может быть выражен в виде строки.)

Раньше вы могли редактировать RegExp, но теперь вам нужен новый с любым изменением.

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...