Pattern.compile( “(*):?”)

时间:2012-09-03 13:25:29

标签: java regex

我正在尝试理解以下代码:

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

我已经做了一些关于它可能意味着什么的research, 但我不太明白:

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

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

由于

4 个答案:

答案 0 :(得分:5)

这称为不情愿的量词。星号和问号*?一起表示“零次或多次,没有匹配来自输入的更多字符”。这可以防止点.表达式匹配输入中的后续冒号:

匹配相同序列的更好表达式是[^:]*:,因为它可以让您避免回溯。这是link to an article explaining why

答案 1 :(得分:4)

?+之类的贪婪运算符之后的*会使运营商不贪婪。如果没有?,那么正则表达式将继续匹配它找到的所有字符,包括:

实际上,正则表达式将匹配在分号(:)之前发生的任何字符串。在这种情况下,分号不是特殊字符。在分号之前出现的内容将被抛入一个组,稍后可以通过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));
    }

收率:

  

你好

     

您好:这是一个测试

答案 2 :(得分:1)

此正则表达式表示anthing ending with :,或者可以理解为anthing till first :

这里':'没什么意思。但它符合模式anystring:将匹配此模式

答案 3 :(得分:0)

我认为'?'是多余的,将应用于'。*'。

':'在regexp中没有任何特殊含义,并且会与字符串中的字符匹配。

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

我找到了一个列出贪婪与不情愿的链接:What is the difference between `Greedy` and `Reluctant` regular expression quantifiers?