我需要一个表达式来捕获类似于以下的字符串:
"A"[不少于5位且不多于6位数字的字符串]"B",换句话说,捕获任何不符合以下规则的内容:
A[0-9][0-9][0-9][0-9][0-9]B
A[0-9][0-9][0-9][0-9][0-9][0-9]B
我尝试过使用负向先行断言:
regex = "a((?![0-9]{5,6}).)*d";
但它无法捕获所有情况。
A(?!\d{5,6}B).*B
A
之后进行一次前瞻。同时,你需要将B
包含在前瞻中,这样它就不会拒绝任何包含超过六位数字的内容。这只是几行非常简单、易懂、可靠的代码,你可以在发布并获得RE版本响应的时间内写并重写3次。当然,使用RE版本时,你所做的事情并不明显。
int examine(String s) {
int foundAt=-1;
for(int i=0;i<s.length;i++) {
char c=s.charAt(i); // something like that
if(c=='A') {
foundAt=i;
continue;
}
if(foundAt != -1) {
if(c == 'B' && i-foundAt < 5 || i-foundAt > 6)
return foundAt;
if(!String.isNumber(c)) // something like that
foundAt = -1; // Not a number before B, reset
}
}
return -1;
}
好的,所以虽然这不仅仅是几行代码(但它也被包含在一个函数调用中),但修改其行为来做一些棘手的事情比修改正则表达式更加直接,因为对RE的更改很容易造成意外后果,应该很容易阅读,一旦消除了前几个简单的错误,它将是完美无缺的——这似乎从来不适用于正则表达式。
那么,这难道不是你能够得到的最短和最易读的代码吗?
n=examine(s);
"A(?![0-9]{5,6}B).*B"
".*"
将贪婪地匹配;如果有多个B
的出现,则匹配将以最后一个结束,而不是第一个。你可能想使用".*?"
代替。例如,如果你有一个长字符串,其中有多个此模式的出现,并且你正在使用find()
方法扫描输入字符串,那么你需要进行勉强匹配。这是一道作业题吗?
我不确定你的正则表达式中为什么有 "a" 和 "d"。
这个正则表达式可以处理从 0 到 4 位数字和 7 位或更多位数字。
String rexexp = "A(\\d{0,4}|\\d{7,})B";
A
和 B
之间只能有数字。但我理解的是,那里面可以是任何东西,只是问题不是很清楚。 - Alan Moore
a
和d
是什么?难道你不是想匹配A
和B
吗? - erickson