我正撞在墙上。我想要一个匹配的正则表达式:空字符串,A
,AB
和ABC
,但不是AC
。我有这个,有效:
/^(A|AB|ABC)?$/
但这是一种简化;在我的应用A
中,B
和C
实际上是长字符类,因此我不想一遍又一遍地重复它们。也许我只是没有以正确的方式看待它。我试过这个:
/^((AB?)C?)?$/
但仍然匹配AC
。
是否有更简单的方法可以扩展到(例如),ABCD
,ABCDE
等?
修改:延伸到ABCDE
,我的意思是匹配:空字符串,A
,AB
,ABC
,{{ 1}},ABCD
。基本上,“以”正则表达式开头。
答案 0 :(得分:9)
试试这个正则表达式:
^(A(B(C)?)?)?$
我认为您可以看到该模式并将其展开为ABCD
和ABCDE
,如:
^(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));