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));