一.捕获群体的概念
可以通过从左到右计算括号对捕获组进行编号。 号码从1开始。 例如,公式((a ) ) b ) c ) )中存在四个这样的组。
1
(a ) (b ) c ) )
2
(a ) ) )。
3
(b ) c ) )
4
(c ) ) )。
零组始终表示整个表达式。 (以上)? 以)开头的组是纯非捕获组,不捕获文本或对组合仪表计数。
与组相关联的捕获输入始终是最接近组的子序列。 如果为了量化而重新计算组,则在第二次计算失败时将保留以前捕获的值。 例如,将字符串' aba '和表达式(a(b )? 如果匹配,则第二组被设置为
是“b”。 在匹配的开头,捕获的所有输入都将被丢弃。
二.大师详情
公共布尔查找(
尝试查找与此模式匹配的输入序列的下一个子序列。
此方法从匹配器区域的开头开始。 如果上次调用方法成功,并且自那时起未重置匹配器,则它将从上一个匹配操作中不匹配的第一个字符开始。
如果匹配成功,可以通过start、end和group的方法获取更多信息。 后退:仅当输入序列的子序列与此匹配器的模式匹配时返回true。
公共字符串组(
返还以前一致的东西。 此匹配与整个正则表达式(组0 )匹配。 “查看组和捕获”)操作匹配的输入子序列。
对于具有输入序列s的匹配器m,表达式m.group (和s.substring ) m.start (m.end ) )是等效的。
请注意,某些模式(例如,a* )与空字符串匹配。 如果模式成功匹配输入中的空字符串,则方法返回空字符串。 返回值:在以前的匹配操作中匹配的字符串格式的子序列。 有可能是空的。 慢速:
公共int start (
返回以前匹配的初始索引。 返回值:第一个匹配字符的索引。 慢速:
公共int end ()
返回最后一个匹配字符之后的偏移。 后退:最后一个匹配字符之后的偏移。 慢速:
以上group ()、start ()、end () )的无参数方法是对应的。 group ) )方法一次返回与字符串内的所有正则表达式一致的子字符串,start ) )返回此次一致的子字符串对整个字符串的开始索引,end ) )方法返回此次一致的子字符串对整个字符串的最后一个字符的索引,即一致的部分
请参阅----------- -请参阅---------------请参阅
公共字符串组(int group ) )。
返回在以前的匹配操作期间由特定组捕获的输入子序列。
对于匹配器m、输入序列s、分组索引g,公式m.group(g )和s.substring ) m.start ) )、m.end(g ) )是相等的。
捕获组是从1到左到右的索引。 零组表示整个模式。 因此,表达式m.group(0)等效于m.group(0) )。
如果匹配成功,但指定的组与输入序列的任何部分都不匹配,则返回null。 请注意,某些组(例如,(a* ) )与空字符串匹配。 如果这些组成功匹配输入中的空字符串,方法将返回空字符串。 参数: group -此匹配模式下捕获组的索引。 返回:组在先前匹配期间获取的子序列。 可能为空。 如果组与输入的部分不匹配,则返回null。 慢速:
公共开始(int group )。
返回在以前的匹配操作期间由特定组检索的子序列的初始索引。
捕获组是从1到左到右的索引。 零组表示整个模式。 因此,表达式m.start(0)等效于m.start )。 参数: group -此匹配模式下捕获组的索引。 后退:组捕获中第一个字符的索引; 如果匹配成功,但组本身没有匹配项,则返回-1。 慢速:
公共插入(int group )。
返回在以前的匹配操作期间由特定组捕获的子序列的最后一个字符
之后的偏移量。捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.end(0) 等效于m.end()。参数:group - 此匹配器模式中捕获组的索引。返回:组捕获的最后字符之后的偏移量;如果匹配成功但组本身没有任何匹配项,则返回 -1。抛出:
以上group(int group)、start(int group)、end(int group)这三个带有参数的方法也是相对应的。group(int group)方法返回的是一次与正则表达式参数group指定的组匹配的子字符串,而start(int group))返回的是与参数group指定的(正则表达式捕获)组匹配的子字符串在整个字符串中的开始索引,end()int group方法返回的是与参数group指定的(正则表达式捕获)组匹配的子字符串的最后一个字符在整个字符串中的索引(也即匹配的子字符之后的偏移量)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
如果匹配成功,则可通过 start、end 和 group 方法获取更多信息,而 find() 方法的后续调用将从此匹配操作未匹配的第一个字符开始。返回:当且仅当从给定索引开始的输入序列的子序列匹配此匹配器的模式时才返回 true。抛出:
public int groupCount()
返回此匹配器模式中的捕获组数。
根据惯例,零组表示整个模式。它不包括在此计数中。
任何小于等于此方法返回值的非负整数保证是此匹配器的有效组索引。返回:此匹配器模式中的捕获组数。
可以这样理解:group(0)对应的是整个正则表达式匹配部分,group(1)~group(groupCount)则是小括号内匹配部分。
测试代码
public class TestMatcher{
/**
* 正则的捕获组测试
*/
public static void testMatcherGroup2(){
String a = "圈子abcddd dfasdabc aabbbcd搜狐来了-=dfd aadbbbababbcdddd";
String regex = "(a(b)?)+"; // 有两个组:a(b)? 和 b
Matcher m = Pattern.compile(regex).matcher(a);
List groupAllList = new ArrayList();
List groupZeroList = new ArrayList();
List groupOneList = new ArrayList();
List groupTwoList = new ArrayList();
while(m.find()){
groupAllList.add(m.group());
groupZeroList.add(m.group(0));
groupOneList.add(m.group(1));
groupTwoList.add(m.group(2));
}
System.out.println("groupAllList=" + groupAllList);
System.out.println("groupZeroList=" + groupZeroList);
System.out.println("groupOneList=" + groupOneList);
System.out.println("groupTwoList=" + groupTwoList);
System.out.println(m.groupCount());
int index = a.indexOf("-=");
if(m.find(index)){
System.out.println("------" +m.group(0));
}
}
public static void main(String []args){
testMatcherGroup2();
}
}
输出结果如下:
groupAllList=[ab, a, ab, aab, aa, abab]
groupZeroList=[ab, a, ab, aab, aa, abab]
groupOneList=[ab, a, ab, ab, a, ab]
groupTwoList=[b, null, b, b, null, b]
2
------aa