1

我试图理解以下代码:

Pattern.compile("(.*?):")

我已经对它的含义进行了一些研究,但我不太明白:

根据 java 文档, * 表示 0 次或更多次,而 ? 意味着一次或根本没有。

另外,':'是什么意思?

谢谢

4

4 回答 4

5

这称为勉强量词。星号和问号*?一起表示“零次或多次,匹配的输入字符数不超过需要的字符数”。这就是阻止点.表达式匹配输入中后续冒号:的原因。

匹配相同序列的更好表达式是[^:]*:,因为它可以避免回溯。这是一篇解释原因的文章的链接

于 2012-09-03T13:28:22.453 回答
4

之后的?贪心算子,如+or*将使算子不贪心。如果没有?,该正则表达式将继续匹配它找到的所有字符,包括:.

事实上,正则表达式将匹配出现在分号 ( :) 之前的任何字符串。在这种情况下,分号不是特殊字符。分号之前的内容将被放入一个组中,以后可以通过Matcher对象访问该组。

此代码片段有望使事情更清楚:

    String str = "Hello: This is a Test:";
    Pattern p1 = Pattern.compile("(.*?):");
    Pattern p2 = Pattern.compile("(.*):");
    
    Matcher m1 = p1.matcher(str);
    if (m1.find())
    {
        System.out.println(m1.group(1));            
    }
    
    Matcher m2 = p2.matcher(str);
    if (m2.find())
    {
        System.out.println(m2.group(1));
    }

产量:

你好

你好:这是一个测试

于 2012-09-03T13:28:18.087 回答
1

这个正则表达式的意思是anthing ending with :或者可以理解为anthing till first :

这里的“:”没有任何意义。但它符合模式anystring:将匹配此模式

于 2012-09-03T13:32:54.563 回答
0

我觉得 '?' 是多余的,将应用于'.*'。

':' 在正则表达式中没有任何特殊含义,将与字符串中的字符匹配。

编辑: dasblinkenlight 是对的,如果贪婪,正则表达式将尝试尽可能多地匹配,他的建议也是正确的。

我找到了一个列出贪婪与不情愿的链接: “贪婪”和“不情愿”正则表达式量词有什么区别?

于 2012-09-03T13:29:31.940 回答