我的代码:
Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
输出:
0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5
我所知道的:
Java API说:
我想知道的事情:
答案 0 :(得分:11)
?
是一个贪婪的量词,因此它会在尝试0次出现之前首先尝试匹配1次出现。在你的字符串中,
它比这复杂一点,但这是主要的想法。当1次出现不匹配时,它将尝试0次出现。
对于start,end和group的值,它们将是匹配开始,结束和组匹配的位置,所以在你的字符串的第一个0-occurence匹配中,你得到1,1和emtpy字符串。我不确定这真的能回答你的问题。
答案 1 :(得分:3)
迭代几个例子可以清除matcher.find()
给你的功能:
正则表达式引擎从字符串(即ababa)中获取一个字符并尝试查找是否可以找到您在字符串中搜索的模式。如果模式存在,那么(如提到的API):
matcher.start()返回起始索引, matcher.end()返回最后一个字符匹配后的偏移量。
如果匹配不存在。然后start()和end()返回相同的索引,这符合匹配的长度为零。
请查看以下示例:
// Searching for string either "a" or ""
Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("abaabbbb");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
输出:
0[a]1
1[]1
2[a]3
3[a]4
4[]4
5[]5
6[]6
7[]7
8[]8
// Searching for string either "aa" or "a"
Pattern pattern = Pattern.compile("aa?");
Matcher matcher = pattern.matcher("abaabbbb");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
输出:
0[a]1
2[aa]4