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

7

我正在苦苦思索。我需要一个正则表达式来匹配:空字符串,AABABC,但是不包括AC。我有一个可以用的正则表达式:

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

但这只是一种简化;在我的应用程序中,ABC实际上是长字符类,因此我不想反复重复它们。也许我没有从正确的角度看待它。我尝试了以下方法:

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

但那仍然符合AC

有没有更简单的方法来实现这个功能,能够扩展到(比如)ABCDABCDE等等?

编辑: 所谓扩展到ABCDE,是指其匹配空字符串,AABABCABCDABCDE。基本上,是一个“以……开始”的正则表达式。


1
你想以什麼方式擴展它? - Gumbo
C 不能在 A 之前出现,或者 A 必须跟着一个 B - Rubens Farias
所以你想允许 ABCD 但不允许 ACDABCDE 但不允许 ACDE - Gumbo
抱歉,我解释了我希望它如何扩展。我想我真正寻找的是一种“以...开头”的正则表达式。 - Jenni
4个回答

14

尝试使用这个正则表达式:

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

我认为您可以看到模式并将其扩展到像ABCDABCDE这样的内容,例如:

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

现在每个部分都依赖于前面的部分(B 依赖于 AC 依赖于 B,等等)。


1
谢谢。我简直不敢相信我没有想到只需更改分组。而且这很容易扩展:^(A(B(C(D(E)?)?)?)?)?$。这个网站速度超快,我发完帖子后去拿咖啡,回来时已经有三个正确答案了。 - Jenni
@CarlSmotricz 实际上,当 C 不是单个字符时,它可以完美地工作。 - Kar.ma

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

应该这样做。

这是使用非捕获组结构(?: xxx ),以避免干扰您可能正在进行的任何匹配捕获。


感谢。要匹配空字符串,您必须在另一个 (?: ... )? 中匹配整个内容。 - Jenni
@Jenni:没错,再加一层嵌套就可以了。 - Carl Smotricz

4
这应该可以做到:
/^A(BC?)?$/

0

这似乎有点奢侈,但它适用于字符类和字符。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接