正则表达式匹配A,AB,ABC,但不匹配AC。 (“以。。开始”)

时间:2010-01-05 16:06:29

标签: javascript regex

我正撞在墙上。我想要一个匹配的正则表达式:空字符串,AABABC,但不是AC。我有这个,有效:

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

但这是一种简化;在我的应用A中,BC实际上是长字符类,因此我不想一遍又一遍地重复它们。也许我只是没有以正确的方式看待它。我试过这个:

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

但仍然匹配AC

是否有更简单的方法可以扩展到(例如),ABCDABCDE等?

修改:延伸到ABCDE,我的意思是匹配:空字符串,AABABC,{{ 1}},ABCD。基本上,“以”正则表达式开头。

4 个答案:

答案 0 :(得分:9)

试试这个正则表达式:

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

我认为您可以看到该模式并将其展开为ABCDABCDE,如:

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

现在每个部分都取决于前面的部分( B 取决于 A C 取决于 B ,等)。

答案 1 :(得分:5)

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

应该这样做。

这是使用非捕获组构造(?: xxx ),以免弄乱你可能正在做的任何匹配。

答案 2 :(得分:4)

这应该这样做:

/^A(BC?)?$/

答案 3 :(得分:0)

这看起来有点奢侈,但它适用于角色类和角色。

(如果可以表示为字符串,则总是使用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));