我正在尝试理解以下代码:
Pattern.compile("(.*?):")
我已经做了一些关于它可能意味着什么的research, 但我不太明白:
根据java文档,*表示0次或更多次, 而?意味着一次或根本不是。
另外,':'是什么意思?
由于
答案 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?