()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
* 0次或者多次, 匹配前面的子表式零次或多次
+ 1次或者多次,匹配前面的子表达式一次或多次
? 0次或者1次,匹配前面的子表达式零次或一次 , 这个? 代表子表式可以忽略
\D 非数字
import java.util.regex.*;
public class Patternk {
public static void main(String[] args)
{
// 按指定模式在字符串查找
String line = "Thisk3900! OK?";
String pattern1 = "This([0-9]+)?(\\D*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern1);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
int n = m.groupCount();
System.out.println("count: " + n);
System.out.println("group(): " + m.group());
System.out.println("group(0): " + m.group(0));
System.out.println("group(1): " + m.group(1));
if(n > 1)
System.out.println("group(2): " + m.group(2));
if(n > 2)
System.out.println("group(3): " + m.group(3));
} else {
System.out.println("NO MATCH");
}
boolean matche1 = m.matches();
System.out.println("actualString = " + matche1);
}
}
结果:
count: 2
group(): Thisk
group(0): Thisk
group(1): null
group(2): k
actualString = false
我们来解释这个匹配规则
String line = "Thisk3900! OK?";
String pattern1 = "This([0-9]+)?(\\D*)";
1. 首先匹配 This,
2. 匹配 规则 ([0-9]+)? 为匹配 剩下的 "k3900! OK?" 字符串, 此时发现第一个字符为 k, 匹配失败,由于 匹配规则中有 ? ,所以这次可以忽略,
3. 匹配下一个规则 (\\D*) , 匹配的字符仍然为"k3900! OK?" 字符串(因为规则2没有匹配成功,而且可以忽略)。 此时匹配到 “k”, 由于 “3” 是数字了,所以匹配结束。
因为匹配规则中有两个 () () 括号,即两个分组,所以有两个group, 第一个([0-9]+)? 没有匹配成功,所以group(1) = null, 第二个分组 (\\D*) 匹配到 k, 所以 group(2) = k.
4. boolean matche1 = m.matches(); 这个matches() 函数 是全量匹配, 即所有字符串都要匹配上才算成功, group(), group(0), 打印的就是匹配到的字符串,由于 "Thisk" 不等于"Thisk3900! OK?", 所有匹配不上。 结果为 false。
参考: