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

IT技术 javascript regex
2021-01-13 03:49:37

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

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

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

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

但这仍然匹配AC

有没有更简单的方式来做到这一点,这可以扩展到(比方说)ABCDABCDE等等?

编辑:通过扩展到ABCDE,我的意思是它会匹配:空字符串、AABABCABCDABCDE基本上,“以”正则表达式开始。

4个回答

试试这个正则表达式:

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

我想你可以看到的图案和扩大它ABCDABCDE这样的:

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

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

如果 C 实际上不是单个字符,这可能会失败。
2021-03-20 03:49:37
谢谢。我不敢相信我没想到只是改变分组。这很容易扩展:^(A(B(C(D(E)?)?)?)?)?$. 这个网站也超级快,我发完后去喝咖啡,回来时已经有三个正确的答案
2021-03-28 03:49:37
/^A(?:B(?:C)?)?$/

应该这样做。

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

谢谢。要匹配空字符串,您必须在另一个中匹配整个内容(?: ... )?
2021-03-19 03:49:37
@Jenni:是的,应该使用另一层嵌套。
2021-03-23 03:49:37

这应该这样做:

/^A(BC?)?$/

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

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