【问题标题】:Negative look ahead java负前瞻java
【发布时间】:2013-06-20 20:50:07
【问题描述】:

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

“A”[A string that is NOT atleast 5 and atmost 6 numbers]“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 是什么?你不是要匹配A 和B 吗?

标签: java regex


【解决方案1】:
A(?!\d{5,6}B).*B

您只想在A 之后执行一次前瞻操作。而且您必须在前瞻中包含B,这样它就不会拒绝任何超过六位数的内容。

【讨论】:

  • +1。对于那些说这是不可读的人,请花时间学习如何阅读它。
【解决方案2】:

这只是几行非常简单、可理解、可靠的代码,您可以在发布并获得对 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);

如果替换为易于阅读、可靠的函数调用,则可以完全消除较短代码的任何“优势”。

(我认为这很有可能是一个家庭作业问题,如果是,则不应正确回答)

【讨论】:

  • 这是一个糟糕的想法,绝不会更清晰、更明显或更容易修改。正如其他响应者所证明的那样,修改是微不足道的。对于模式匹配,正则表达式是正确的工具,如果给定的情况不清楚,两行文档(示例匹配,示例排除)优于二十行误导。
【解决方案3】:

你几乎拥有它。试试这个:

"A(?![0-9]{5,6}B).*B"

注意".*"会贪婪匹配;如果B 多次出现,则匹配将以last 结束,而不是第一个。您可能想改用".*?"。例如,如果您有一个长字符串,其中多次出现此模式,并且您正在使用find() 方法扫描输入字符串,您可能会不情愿地进行匹配。

【讨论】:

    【解决方案4】:

    这是一道作业题吗?

    我不确定你的正则表达式中为什么有“a”和“d”。

    这将处理从 0 到 4 位以及 7 位或更多位的任何内容。

    String rexexp = "A(\\d{0,4}|\\d{7,})B";
    

    【讨论】:

    • 您假设A 和B 之间只能有数字。我读它的方式,里面可能有任何东西,但问题并不是那么清楚。
    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 2012-06-22
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多