我试图理解以下代码:
Pattern.compile("(.*?):")
我已经对它的含义进行了一些研究,但我不太明白:
根据 java 文档, * 表示 0 次或更多次,而 ? 意味着一次或根本没有。
另外,':'是什么意思?
谢谢
这称为勉强量词。星号和问号*?
一起表示“零次或多次,匹配的输入字符数不超过需要的字符数”。这就是阻止点.
表达式匹配输入中后续冒号:
的原因。
匹配相同序列的更好表达式是[^:]*:
,因为它可以避免回溯。这是一篇解释原因的文章的链接。
之后的?
贪心算子,如+
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));
}
产量:
你好
你好:这是一个测试
这个正则表达式的意思是anthing ending with :
或者可以理解为anthing till first :
。
这里的“:”没有任何意义。但它符合模式anystring:
将匹配此模式
我觉得 '?' 是多余的,将应用于'.*'。
':' 在正则表达式中没有任何特殊含义,将与字符串中的字符匹配。
编辑: dasblinkenlight 是对的,如果贪婪,正则表达式将尝试尽可能多地匹配,他的建议也是正确的。
我找到了一个列出贪婪与不情愿的链接: “贪婪”和“不情愿”正则表达式量词有什么区别?