Java Pattern和Matcher简介说明

Java Pattern和Matcher简介说明

转自:

http://www.java265.com/JavaCourse/202206/3831.html

下文笔者讲述Java代码中的Pattern和Matcher类的简介说明

Pattern用法

Pattern类:
   用于创建一个正则表达式
   创建一个匹配模式
    可以通过两个静态方法创建
     compile(String regex)和compile(String regex,int flags)
   
   参数说明:
     regex是正则表达式
     flags为可选模式(如:Pattern.CASE_INSENSITIVE忽略大小写)

例:

Pattern pattern = Pattern.compile("Java");
//返回此模式的正则表达式即Java
System.out.println(pattern.pattern());

Pattern类还有两个根据匹配模式拆分输入序列的方法
    split(CharSequence input)
	split(CharSequence input, int limit)
    其中limit为返回元素的个数

例:

Pattern pattern = Pattern.compile("Java");
String test="123Java456Java789Java";
String[] result = pattern.split(test);
for(String s : result)
    System.out.println(s);
 
运行以上代码,将输出以下信息
123
456
789

例:

Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";

String[] result = pattern.split(test,2);
for(String s : result)
System.out.println(s);

result = pattern.split(test,10);
System.out.println(result.length);

result = pattern.split(test,-2);
System.out.println(result.length);

result = pattern.split(test,0);
System.out.println(result.length);

运行以上代码,将输出以下信息
123
456Java789Java
4
4
3

Matcher类用法

  
Matcher类提供了对正则表达式的分组支持
  以及对正则表达式的多次匹配支持
  要想得到更丰富的正则匹配操作
  那就需要将Pattern与Matcher联合使用

例:

Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";
Matcher matcher = pattern.matcher();

Matcher类提供了三个返回boolean值得匹配方法
   matches()
   lookingAt()
   find()
   find(int start)
其中matches()用于全字符串匹配
  lookingAt从字符串最开头开始匹配满足的子串
  find可以对任意位置字符串匹配
  其中start为起始查找索引值

Pattern pattern = Pattern.compile("Java");
String test1 = "Java";
String test2 = "Java1234";
String test3 = "1234Java"

// match方法需要整个字符串都匹配正则才返回true
// 返回true
Matcher matcher = pattern.matcher(test1);
System.out.println(matcher.matches());
// 返回false
matcher = pattern.matcher(test2);
System.out.println(matcher.matches());

// lookingAt需要字符串是以正则模式开头,才返回true
// 返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.lookingAt());
// 返回false
matcher = pattern.matcher(test3);
System.out.println(matcher.lookingAt());

//从相应的下标开始匹配,只要有匹配到的就返回true
//返回true
matcher = pattern.matcher(test1);
System.out.println(matcher.find());
//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.find());
matcher = pattern.matcher(test3);
//返回true
System.out.println(matcher.find(2));
matcher = pattern.matcher(test3);
//返回false
System.out.println(matcher.find(5));

Matcher类提供了start()
end()
group()
分别用于返回字符串的起始索引,结束索引,及匹配到到的字符串

Pattern pattern = Pattern.compile("(java)");
Matcher matcher = pattern.matcher("12java自由java之路");

int groupCount = matcher.groupCount();
System.out.println(groupCount);
groupCount = matcher.groupCount();
System.out.println(groupCount);

while (matcher.find()) {
    int start = matcher.start();
    int end = matcher.end();
    String group = matcher.group();
    System.out.println("start:end:group-->" + start + ":" + end + ":" + group);
}

Matcher类提供了start(int gropu),end(int group),group(int i),groupCount()用于分组操作

Pattern pattern1 = Pattern.compile("(?<p1>java)(python)");
Matcher matcher1 = pattern1.matcher("java自由java之路javapython自由之路python");

// 输出false,因为要满足整个字符串匹配正则才输出true
System.out.println(matcher1.matches());
// 输出false,因为要满足字符串以正则模式开头才输出true
System.out.println(matcher1.lookingAt());

// 输出分组数量:2
// 加上默认分组其实有三个分组:javapython、java、python
int count = matcher1.groupCount();
System.out.println("分组数量:" + count);

while (matcher1.find()) {
    System.out.println("find str...");
    for (int i = 0; i <= count; i++) {
        int start = matcher1.start(i);
        int end = matcher1.end(i);
        String group = matcher1.group(i);
        System.out.println("start:end:group-->" + start + ":" + end + ":" + group);
    }
    // 通过分组名称来获取分组的值
    System.out.println("xxx-->"+matcher1.group("p1"));
} 

Matcher类还提供region(int start, int end)(不包括end)方法用于设定查找范围,并提供regionStrat()和regionEnd()用于返回起始和结束查找的索引。
此方法和find方法类似,但是比find方法更强大
find方法只能制定开始下标。但是region可以指定一个范围。

Pattern pattern = Pattern.compile("Java");
String test = "123JavaJava";
Matcher matcher = pattern.matcher(test);
matcher.region(7, 11);
// 返回7
System.out.println(matcher.regionStart());
// 返回11
System.out.println(matcher.regionEnd());
matcher.find();
//返回 Java
System.out.println(matcher.group());
Matcher类提供了两种用于重置当前匹配器的方法:reset()和reset(CharSequence input)

Pattern pattern = Pattern.compile("Java");
String test = "Java";
Matcher matcher = pattern.matcher(test);

matcher.find();
//返回Java
System.out.println(matcher.group());
//从起始位置重新匹配
matcher.reset();

matcher.find();
//返回Java
System.out.println(matcher.group());

//返回false
//相当于matcher = pattern.matcher("Python");
matcher.reset("Python");
System.out.println(matcher.find());
最后说一下Matcher类的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替换全部匹配到的字符串,而replaceFirst仅仅是替换第一个匹配到的字符串。

Pattern pattern = Pattern.compile("Java");
String test = "JavaJava";
Matcher matcher = pattern.matcher(test);
//返回PythonPython
System.out.println(matcher.replaceAll("Python"));
//返回PythonJava
System.out.println(matcher.replaceFirst("python"));
还有两个方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允许直接将匹配的字符串保存在另一个StringBuffer中并且是渐进式匹配,并不是只匹配依次或匹配全部,而appendTail则是将未匹配到的余下的字符串添加到StringBuffer中。

Pattern pattern = Pattern.compile("Java");
Matcher matcher = pattern.matcher("Java1234");

//返回true
System.out.println(matcher.find());
StringBuffer sb = new StringBuffer();

matcher.appendReplacement(sb, "Python");
//输出Python
System.out.println(sb);

matcher.appendTail(sb);
//输出Python1234
System.out.println(sb);
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Java Pattern和Matcher简介说明