我需要一个表达式来捕获这样的字符串:
“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" ;
但它无法捕捉所有情景。
答案 0 :(得分:6)
A(?!\d{5,6}B).*B
你只想在A
之后做一次前瞻。并且您必须在前瞻中包含B
,因此它不会拒绝超过六位数的任何内容。
答案 1 :(得分:4)
这只是几行非常简单,易懂,可靠的代码,您可以在发布和获取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);
如果用易于阅读,可靠的函数调用取代,则可以完全消除较短代码的任何“优势”。
(我认为很有可能这是一个家庭作业问题,如果是这个问题就不应该正确回答)
答案 2 :(得分:3)
你几乎拥有它。试试这个:
"A(?![0-9]{5,6}B).*B"
请注意,".*"
会贪婪地匹配;如果多次出现B
,则匹配将以 last 结束,而不是第一次。您可能希望使用".*?"
代替。例如,如果您有一个长字符串,其中多次出现此模式,并且您使用find()
方法扫描输入字符串,那么您需要不情愿地匹配。
答案 3 :(得分:1)
这是一个家庭作业问题吗?
我不确定为什么你的正则表达式中有“a”和“d”。
这将处理0到4位数字和7位或更多位数字。
String rexexp = "A(\\d{0,4}|\\d{7,})B";