以上面的代码为例:
- match.find():
- 根据指定的规则,定位满足规则的子字符串(比如"1998")
?groups[0]=0 ;把该子串的结束索引+1的值记录到 groups[1] = 4
2.2 记录第一组括号()匹配到的字符串("19")的位置 : groups[2]=0 , groups[3]=2
2.3 记录第二组括号()匹配到的字符串("98")的位置 : groups[4]=2 , groups[5]=4
如果有更多的分组就以此类推
下标从0开始验证:
在程序中打上断点 , 点击debug调试:
文章插图
可以看到刚开始时,groups数组的所有值都是-1
文章插图
点击step over , 可以看到groups数组的变化如下:
文章插图
//源码:public String group(int group) {if (first < 0)throw new IllegalStateException("No match found");if (group < 0 || group > groupCount())throw new IndexOutOfBoundsException("No group " + group);if ((groups[group*2] == -1) || (groups[group*2+1] == -1))return null;return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();}
在源码中,返回语句 return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
中,[group * 2] 和 [group * 2 + 1]计算的就是groups数组的位置
如果我们想要取出第一组括号匹配的子字符串,即groups下标为[2]和[3],只需要将传入的参数改为1即可
groups[1 * 2]=groups[2] , groups[1 * 2 + 1]=groups[3]取出第二组括号匹配的字符串同理 , 将传入的参数改为2即可
groups[2 * 2]=groups[4] , groups[2 * 2 + 1]=groups[5]
文章插图
【day50-正则表达式01】小结:
- 如果正则表达式有括号(),即分组
- 取出匹配的字符串规则如下:
matcher.group(0)
表示匹配到的子字符串matcher.group(1)
表示匹配到的子字符串的第1组字串matcher.group(2)
表示匹配到的子字符串的第2组字串- 以此类推,注意分组的数不能越界
- 基本介绍
如果想要灵活地运用正则表达式 , 必须了解其中各种元字符(Metacharacter)的功能,元字符从功能上大致分为:
- 限定符
- 选择匹配符
- 分组组合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
\\
符号的说明:在我们使用正则表达式去检索某些特殊字符时,需要用到转义符号\\
,否则检索不到结果,甚至会报错 。注意:在Java的正则表达式中,两个
\\
表示其他语言中的一个\
需要用到转义符号的字符有如下:
. * + () $ / \ ? [] ^ {}
例子:
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;//演示转义字符的使用public class RegExp02 {public static void main(String[] args) {String content = "abc$(a.bc(123(";//匹配 ( ==> \\(//匹配 ( ==> \\.//String regStr = "\\(";String regStr = "\\.";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while (matcher.find()) {System.out.println("找到:" + matcher.group(0));}}}
文章插图
文章插图
5.4.2元字符-字符匹配符
文章插图
文章插图
- 应用实例
[a-z]
说明:
[a-z]
表示可以匹配 a-z 之间任意的一个字符
[A-Z]
表示可以匹配 A-Z 之间任意的一个字符
[0-9]
表示可以匹配 0-9 之间任意的一个字符
比如[a-z]、[A-Z]去匹配“a11c8”会得到什么结果?结果是:a、c
- java正则表达式默认是区分大小写的,如何实现不区分大小写?