Javascript 匹配A、AB、ABC但不匹配AC的正则表达式(“以”开头)

Javascript 匹配A、AB、ABC但不匹配AC的正则表达式(“以”开头),javascript,regex,Javascript,Regex,我的头撞在墙上。我想要一个匹配的正则表达式:空字符串、a、AB和ABC,但不匹配AC。我有这个,它是有效的: /^(A|AB|ABC)?$/ 但这是一种简化;在我的应用程序A,B和C实际上是长字符类,所以我不想重复它们。也许我只是看得不对。我试过这个: /^((AB?)C?)?$/ 但这仍然与AC相匹配 有没有一种更简单的方法可以扩展到(比如),ABCD,ABCDE,等等 Edit:通过扩展到ABCDE,我的意思是它将匹配:空字符串,A,AB,ABC,ABCDE。基本上,一个“以”regex

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

/^(A|AB|ABC)?$/
但这是一种简化;在我的应用程序
A
B
C
实际上是长字符类,所以我不想重复它们。也许我只是看得不对。我试过这个:

/^((AB?)C?)?$/
但这仍然与AC相匹配

有没有一种更简单的方法可以扩展到(比如),
ABCD
ABCDE
,等等


Edit:通过扩展到
ABCDE
,我的意思是它将匹配:空字符串,
A
AB
ABC
ABCDE
。基本上,一个“以”regex开头。

试试这个正则表达式:

^(A(B(C)?)?)?$
我想您可以看到模式并将其展开为
ABCD
ABCDE
,如:

^(A(B(C(D)?)?)?)?$
^(A(B(C(D(E)?)?)?)?)?$
现在每个部分都依赖于前面的部分(B依赖于A,C依赖于B,等等)。

这应该可以做到:

/^A(BC?)?$/
我应该这样做


这是使用非捕获组构造
(?:xxx)
,以避免弄乱您正在进行的任何匹配捕获。

这似乎有点奢侈,但它适用于角色类和角色

(如果indexOf可以表示为字符串,则始终使用indexOf。)

您过去可以编辑RegExp,但现在需要一个新的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));
RegExp.prototype.extend=函数(c){
var s='',rx=this.toString();
rx=rx。替换(/(\W+)$/,c+“$1”)。替换(/^\/\\/$/g,”);
如果(this.global)s+='g';
如果(this.multiline)s+='m';
如果(this.ignoreCase)s+='i';
返回RegExp(rx,s);
}
String.prototype.longMatch=函数(arr){
//如果(this='')返回true;
var Rx=RegExp(“^(“+arr.shift()+”);
变量i=0,L=Math.min(s.length,arr.length),
M=此匹配(Rx);
而(i
您想以什么方式扩展它?
C
不能由
A
开头,或者
A
后面必须跟着
B
?所以您想允许
abo
而不是
ACD
ABCDE
而不是
ACDE
?对不起,我已经澄清了扩展它的意思。我想我真的在寻找一种“以”开头的正则表达式。如果C不是一个字符,这可能会失败。谢谢。我真不敢相信我竟然不想改变分组。这很容易扩展:
^(A(B(C(D(E)?)?)?)?)?$
。这个网站也非常快,我发帖后去喝了杯咖啡,当我得到回复时已经有三个正确答案了。谢谢。要匹配空字符串,您必须在另一个
(?:…)?
@Jenni:yes中匹配整个内容,另一个嵌套级别应该可以做到这一点。
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));