admin 管理员组文章数量: 1086019
I'm banging my head against a wall. I want a regex that matches: empty string, A
, AB
, and ABC
, but not AC
. I have this, which works:
/^(A|AB|ABC)?$/
But this is a simplification; in my app A
, B
, and C
are actually long character classes, so I don't want to repeat them over and over. Maybe I'm just not looking at it the right way. I tried this:
/^((AB?)C?)?$/
But that still matches AC
.
Is there a simpler way to do this, that could be extended to (say), ABCD
, ABCDE
, etc.?
Edit: By extend to ABCDE
, I mean it would match: empty string, A
, AB
, ABC
, ABCD
, ABCDE
. Basically, a "starts with" regex.
I'm banging my head against a wall. I want a regex that matches: empty string, A
, AB
, and ABC
, but not AC
. I have this, which works:
/^(A|AB|ABC)?$/
But this is a simplification; in my app A
, B
, and C
are actually long character classes, so I don't want to repeat them over and over. Maybe I'm just not looking at it the right way. I tried this:
/^((AB?)C?)?$/
But that still matches AC
.
Is there a simpler way to do this, that could be extended to (say), ABCD
, ABCDE
, etc.?
Edit: By extend to ABCDE
, I mean it would match: empty string, A
, AB
, ABC
, ABCD
, ABCDE
. Basically, a "starts with" regex.
4 Answers
Reset to default 15Try this regular expression:
^(A(B(C)?)?)?$
I think you can see the pattern and expand it for ABCD
and ABCDE
like:
^(A(B(C(D)?)?)?)?$
^(A(B(C(D(E)?)?)?)?)?$
Now each part depends on the preceeding parts (B depends on A, C depends on B, etc.).
/^A(?:B(?:C)?)?$/
should do it.
This is using the non-capturing group construct (?: xxx )
so as not to mess up any match capturing you may be doing.
This should do it:
/^A(BC?)?$/
This seems a little extravagant, but it works for character classes as well as characters.
(You would always use indexOf if it could be expressed as a string.)
You used to be able to edit a RegExp, but now you need a new one with any change.
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));
本文标签:
版权声明:本文标题:javascript - Regular expression to match A, AB, ABC, but not AC. ("starts with") - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1738402498a1974673.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
C
cannot be preceed by anA
, orA
must be followed by aB
? – Rubens Farias Commented Jan 5, 2010 at 16:10ABCD
but notACD
andABCDE
but notACDE
? – Gumbo Commented Jan 5, 2010 at 16:11