Java Regex中Matcher类的group(int m)方法

网上看到的示例:http://www.runoob.com/java/java-regular-expressions.html

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

以上实例编译运行结果如下:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

参考此链接大致了解捕获组: http://mcj8089.iteye.com/blog/1183075

从结果看当调用System.out.println(“Found value: ” + m.group(1) );时
是输出在

String pattern = "(.*)(\\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

这种情况下属于(.*)的部分,但是考虑到(\\d+)是截取数字的部分,所以刚开始以为属于(.*)的部分只是”This order was placed for QT”。经过测试后发现在(.*)(\\d+)(.*)中。当查找(.*)部分时会尽量的查找,最后只会留下最少一部分符合(\\d+)的部分给他,也就是最后一个0。因此每个捕获组对应的字符串如下:
(.*):This order was placed for QT300
(\\d+):0
(.*):! OK?

捕获组的含义和官方例子
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式(dog) 创建了单一分组,组里包含”d”,”o”,和”g”。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用matcher对象的groupCount方法来查看表达式有多少个分组。groupCount方法返回一个int值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(组0),它总是代表整个表达式。该组不包括在groupCount的返回值中。

再来了解:
public String group(int group)
返回在以前匹配操作期间由给定组捕获的输入子序列。
对于匹配器 m、输入序列 s 和组索引 g,表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。
(s代表字符串)
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。

如果该匹配成功了,但指定组未能匹配输入序列的任何部分,则返回 null。注意,某些组(例如,(a*))匹配空字符串。当这些的组成功匹配输入中的空字符串时,此方法将返回空字符串。
/=====================================
public String substring(int beginIndex,int endIndex)序号从0开始
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
示例:

“hamburger”.substring(4, 8) returns “urge”
“smiles”.substring(1, 5) returns “mile”

参数:
beginIndex - 起始索引(包括)。
endIndex - 结束索引(不包括)。
返回:
指定的子字符串。

/=====================================
public int start(int group)序号从0开始,返回捕获组的第一个字符的索引值
返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.start(0) 等效于 m.start()。

指定者:
接口 MatchResult 中的 start
参数:
group - 此匹配器模式中捕获组的索引。
返回:
组捕获的首个字符的索引;如果匹配成功但组本身没有任何匹配项,则返回 -1。

/=====================================
public int end(int group)序号从0开始,返回捕获组包含的字符串中最后一个字符的索引值的再后一个索引值
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.end(0) 等效于 m.end()。

指定者:
接口 MatchResult 中的 end
参数:
group - 此匹配器模式中捕获组的索引。
返回:
组捕获的最后字符之后的偏移量;如果匹配成功但组本身没有任何匹配项,则返回 -1。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值