【问题标题】:Non-greedy Regular Expression in JavaJava中的非贪婪正则表达式
【发布时间】:2012-01-19 18:16:23
【问题描述】:

我有下一个代码:

public static void createTokens(){
    String test = "test is a word word word word big small";
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test);
    while (mtch.find()){
        for (int i = 1; i <= mtch.groupCount(); i++){
            System.out.println(mtch.group(i));
        }
    }
}

还有下一个输出:

word
w

但在我看来一定是:

word
word

有人请解释一下为什么会这样?

【问题讨论】:

    标签: java regex non-greedy


    【解决方案1】:

    因为您的模式是非贪婪的,所以它们匹配尽可能少的文本,同时仍然包含匹配项。

    删除 ?在第二组中,您将获得

    字字大字小

    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test);
    

    【讨论】:

    • 现在第二组捕获太多而不是太少。不贪心不是问题,贪心不是解决办法。
    • 你是对的,但恕我直言,第二个捕获组的非贪婪解释了为什么它只捕获“w”。第一个捕获组必须捕获“单词”,因为它后面是“单词”字面量。我不知道他在找什么,他在我提交答案后编辑了问题,所以我无法提供正确的正则表达式。
    【解决方案2】:

    通过使用\\s*,它将匹配任意数量的空格,包括 0 个空格。 w 匹配 (\\s*.+?\\s*)。为确保它与空格分隔的单词匹配,请尝试(\\s+.+?\\s+)

    【讨论】:

    • 麻烦的是,正则表达式已经消耗了单词前后的空格字符,所以现在你试图消耗它们两次。
    • 您需要做的就是从正则表达式中删除空格,例如 ...\\s+)word(\\s+...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-04-27
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多