Java Pattern.compile(";(.*):";)

Java Pattern.compile(";(.*):";),java,regex,Java,Regex,我试图理解以下代码: Pattern.compile("(.*?):") 我已经做了一些关于它可能意味着什么, 但我不太明白: 根据java文档,*表示0次或更多次, 虽然意思是一次或根本不 还有,“:”是什么意思 谢谢贪婪操作符之后的?,例如+或*将使操作符不贪婪。如果没有?,该正则表达式将继续匹配它找到的所有字符,包括: 实际上,正则表达式将匹配分号之前发生的任何字符串(:)。在本例中,分号不是特殊字符。分号之前的内容将被放入一个组中,稍后可以通过匹配器对象访问该组 这段代码片段有望让事情

我试图理解以下代码:

Pattern.compile("(.*?):")
我已经做了一些关于它可能意味着什么, 但我不太明白:

根据java文档,*表示0次或更多次, 虽然意思是一次或根本不

还有,“:”是什么意思


谢谢

贪婪操作符之后的
,例如
+
*
将使操作符不贪婪。如果没有
,该正则表达式将继续匹配它找到的所有字符,包括

实际上,正则表达式将匹配分号之前发生的任何字符串(
)。在本例中,分号不是特殊字符。分号之前的内容将被放入一个组中,稍后可以通过
匹配器
对象访问该组

这段代码片段有望让事情变得更清楚:

    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));
    }
收益率:

你好

你好:这是一个测试


贪婪运算符后的
,如
+
*
将使运算符非贪婪。如果没有
,该正则表达式将继续匹配它找到的所有字符,包括

实际上,正则表达式将匹配分号之前发生的任何字符串(
)。在本例中,分号不是特殊字符。分号之前的内容将被放入一个组中,稍后可以通过
匹配器
对象访问该组

这段代码片段有望让事情变得更清楚:

    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));
    }
收益率:

你好

你好:这是一个测试

这被称为不情愿的量词。星号和问号
*?
一起表示“零次或多次,不匹配输入中超出需要的字符”。这就是防止点
表达式与输入中的后续冒号
匹配的原因

匹配相同序列的更好的表达式是
[^::]*:
,因为它可以避免回溯。这是一个。

这被称为不情愿的量词。星号和问号
*?
一起表示“零次或多次,不匹配输入中超出需要的字符”。这就是防止点
表达式与输入中的后续冒号
匹配的原因


匹配相同序列的更好的表达式是
[^::]*:
,因为它可以避免回溯。这是一个。

我认为“?”是多余的,将应用于“*”

“:”在regexps中没有任何特殊意义,将与字符串中的字符匹配

编辑:dasblinkenlight是正确的,如果贪婪的话,regexp会尽可能地匹配,他的建议也是正确的


我发现了一个列出贪婪与勉强的链接:

我认为“?”是多余的,将应用于“*”

“:”在regexps中没有任何特殊意义,将与字符串中的字符匹配

编辑:dasblinkenlight是正确的,如果贪婪的话,regexp会尽可能地匹配,他的建议也是正确的


我发现了一个链接,其中列出了贪婪和勉强:

这个正则表达式的意思是
以:
结尾的anthing,或者可以理解为
anthing直到第一个:


这里的“:”没有任何意义。但是它符合模式
anystring:
将匹配此模式此正则表达式表示
以“
结尾的anthing,或者可以理解为
anthing直到第一个:


这里的“:”没有任何意义。但它符合模式
anystring:
将与此模式匹配签出。@KendallFrey:不错,但在Java中
相当于
[^\n\r\u0085\u2028\u2029]
。签出。@KendallFrey:不错,但在Java中
相当于
[^\n\r\u0085\u2028\u2029]
。这个词是量词,不是限定词:它指定一个数量。事实上,你可以说
限定了量词<代码>*通常是贪婪的,但
会“削弱”它,使它不情愿或不贪婪。@Alanmore你说得对,它是量词。我编辑了答案来解决这个问题。这个词是量词,而不是限定词:它指定了一个数量。事实上,你可以说
限定了量词<代码>*通常是贪婪的,但
会“削弱”它,使它不情愿或不贪婪。@Alanmore你说得对,它是量词。我编辑了答案来解决这个问题。