负面展望未来java

时间:2010-05-18 18:43:22

标签: java regex

我需要一个表达式来捕获这样的字符串:

“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" ;

但它无法捕捉所有情景。

4 个答案:

答案 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";