groupby怎么⽤java对象接收_详解Java正则表达式(中篇)
本篇将继续介绍Java正则表达式的内容, 相关组件以及API⽅法。
相关组件与API
在Java中,与正则有关的组件有两个:
1. Pattern
Pattern
1.
1) public static Pattern compile(String regex)
⽐较常⽤的静态⽅法,返回⼀个Pattern对象
2) public static Pattern compile(String regex, int flags)
flags 表⽰不同的匹配模式,默认情况下为0,表⽰最常⽤的UNICODE模式
3) public Matcher matcher(CharSequence input)
根据输⼊内容,返回Mathcer对象
4) public static boolean matches(String regex, CharSequence input)
⽐较输⼊的正则regex 和字符串 input 是否匹配,匹配返回true,不匹配返回false
5) public String[] split(CharSequence input, int limit)
limit的值,可以是正数n,表⽰最后可以切割n-1次,剩余的部分全部归为数组的最后⼀项;可以是0,表⽰可切割⽆数次,但是如果切割的内容为空字符串,那么⾃动6) public String[] split(CharSequence input)
根据当前正则,切割输⼊的字符串,默认limit为0。
说明:
Pattern对象,然后调⽤public
public Matcher
static Pattern compile(String regex) 返回⼀个Pattern
最常⽤的就是静态⽅法 public
public static
Matcher对象
matcher(CharSequence input)⽅法,返回Matcher
Matcher
2.
2. Matcher
1) public boolean find()
从字符串开头向前匹配,直到匹配不符合停⽌,不管是部分匹配还是全部匹配,都返回true,如果匹配到字符串结束,依然没有匹配当前正则,那么返回false
2) public String group()
这个⽅法必须和find⽅法配合使⽤,单独使⽤就会报错,返回上⼀个find⽅法匹配到的内容。
3) public boolean matches()
当前正则是否匹配字符串整体,匹配返回true,不匹配返回false
4) public String group(int group)
这个⽅法和正则分组有关系,详细内容将在下⼀⼩节正则分组中详细描述。
5) public int groupCount()
返回上⼀次匹配中,分成了⼏个组
6) public Matcher reset(CharSequence input)
根据输⼊字符串,重新⽣成⼀个Matcher对象
7) public Matcher reset()
重置指针,从头开始匹配。
8) public Matcher region(int start, int end)
指定头尾指针的位置,重置指针。只匹配指定范围内的字符串。
9) public int start()
返回头指针的位置
10) public int start(int group)
这个⽅法和上⾯那个重载⽅法,意义完全不同。这个是返回指定的分组,在上⼀次匹配操作后的头指针位置。
11) public int end()
返回上⼀次匹配的尾指针位置。
12) public int end(int group)
返回指定的分组,在上⼀次匹配操作后的尾指针位置
13) public String replaceFirst(String replacement)
替换第⼀个匹配到的内容
14) public String replaceAll(String replacement)
替换全部匹配的内容
数据结构说明与正则分组
数据结构
上⾯介绍Matcher的API,很多⽅法看得⼈迷迷糊糊,什么头指针,尾指针,上⼀次匹配,这些都是什么意思? 为了说明这个问题,需要通过数据结构画图来说明⽩:
String s = "abc123def456";
String regular = "w{3}";
Matcher m = Patternpile(regular).matcher(s);
while(m.find()) {
System.out.println("start: " + m.start());
System.out.println("end: " + m.end());
}
字符串结构如下:
图1
⼀旦Matcher对象建好,那么就会⾃动分配头尾两个指针。调⽤⼀次find⽅法,就会进⾏⼀次匹配操作。 第⼀次调⽤后,匹配到了abc三个字符,此时指针指向为:
图2
此时调⽤start⽅法, 返回的就是上⼀次匹配操作之后,start指针指向的位置,为第⼀个字符的左边,调⽤end⽅法,返回的是end指针的位置,为第三个字符右边。所以,第⼀次调⽤start⽅法,返回结果为0,调⽤end⽅法返回结果为3。
第⼆次调⽤find⽅法后,指针向前移动:
图3
此时调⽤start⽅法,返回3,调⽤end⽅法返回6。
以此类推,直到find⽅法返回false,匹配结束。
经过上⾯的数据结构分析可知,调⽤⼀次find⽅法得到的匹配内容,就称为“上⼀次匹配”,很多⽅法都必须依赖于find⽅法:⽐如
说,start、end、group、groupCount, 还有reset⽅法虽然不直接依赖于find⽅法,但是也息息相关,调⽤reset⽅法后,头尾指针都将归零,重新开始。
正则分组
介绍完Matcher类的数据结构以后,继续介绍正则表达式中的另⼀个重要概念,正则分组。 正则分组主要是⽤于提取出,指定字符串中特定的⼦字符串。
正则分组,有两个重要的点:
1. ( ) ⼩括号的⾥⾯的内容分为⼀组,⼀个正则有n个⼩括号,就表⽰要分成n+1组,其中第0组,是全部匹配内容。
2. find, group,以及groupCount等相关⽅法。
正则分组分为捕获组、分组取名、⾮捕获组、分组复⽤
捕获组、分组取名、⾮捕获组、分组复⽤,下⾯的例⼦将分别进⾏说明。
举例说明1 捕获组:
// ⽬标字符串,⽬标是要提前IOPS,avg的值
String s = " IOPS=2932, bw=329,and other number avg=399, savg=23029";
// 正则。
String regular = "^.*IOPS=(d+)b.*bavg=(d+)b.*$";
Matcher matcher = Patternpile(regular).matcher(s);
if(matcher.find() && upCount() == 2) {
System.out.up(1));
System.out.up(2));
}
1. 对于正则表达式, ^ 匹配字符串开始位置; .* 匹配⼏个空格;IOPS=匹配IOPS=;d+匹配2932,作
为第1组内容;b匹配2与,之间的位置;.* 匹配, bw=329,and other number ;b匹配空格与a之间的位置; avg=匹配avg=; d+匹配399;b匹配9与逗号之间的位置; .*匹配, savg=23029; $匹配结束位置。
2. 调⽤⼀次find⽅法,将匹配到全部字符串内容; 整个匹配内容被分成了三组,第0组是全部字符串内容,第1组得到2932, 第2组内容是399; 调⽤groupCount,不包括第0组,所以结果为2。
分组命名:
replaceall()举例说明2 分组命名
在进⾏分组设置的时候,还可以取组名。 取名格式为: (?<name>exp), 然后⽤up(“groupName”) 取出组内匹配的内容
String s = " IOPS=2932, bw=329,and other number avg=399, savg=23029";
// 正则。
String regular = "^.*IOPS=(?<group1>d+)b.*bavg=(?<group2>d+)b.*$";
Matcher matcher = Patternpile(regular).matcher(s);
if(matcher.find() && upCount() == 2) {
System.out.up("group1"));
System.out.up("group2"));
}
举例说明3 ⾮捕获组
举例说明3 ⾮捕获组:
在进⾏分组的时候,可以给某些不那么重要的组,只分组不编号也不取名字。⾮捕获组的格式为: (?:exp)
// ⽬标字符串,获取avg的值
String s = " IOPS=2932, bw=329,and other number avg=399, savg=23029";
// 正则。
String regular = "^.*IOPS=(?:d+)b.*bavg=(d+)b.*$";
Matcher matcher = Patternpile(regular).matcher(s);
if(matcher.find() && upCount() == 1) {
System.out.up(1));
}
可以看到,(?:d+) 匹配内容,但是不捕获⽂本,也不进⾏分组编号。整个字符串,除了第0组外,只有第1组。
举例说明4 分组复⽤:
分组复⽤:
正则分组后的复⽤。这个使⽤,主要牵扯到replaceFirst或者replaceAll⽅法。
// ⽬标字符串为⼿机号
String s = "183********";
// 正则。
String regular = "(d{3})d{4}(d{4})";
Matcher matcher = Patternpile(regular).matcher(s);
String result = placeAll("$1****$2");
System.out.println(result);
该程序将把⼿机号进⾏模糊处理, 整个正则分为3组,第1组为前3位数字,第2组为后4位数字,所以替换时,使⽤$n,来表⽰引⽤第n组的内容。所以本例的输出结果为: 183****6765
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论