zoukankan      html  css  js  c++  java
  • Java Pattern和Matcher用法

    原文:https://blog.csdn.net/woaigaolaoshi/article/details/50970527

    Pattern用法

    Java正则表达式通过java.util.regex包下的Pattern和Matcher类实现

    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
    

    再细说一下split(CharSequence input, int limit),当limit值大于所能返回的字符串的最多个数或者为负数,返回的字符串个数将不受限制,但结尾可能包含空串,而当limit=0时与split(CharSequence input)等价,但结尾的空串会被丢弃。

    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
    

    这边再给出一个JDK源代码中的列子:

    The input "boo:and:foo", for example, yields the following results with these parameters:

    Regex     Limit     Result    
    : 2 { "boo", "and:foo" }
    : 5 { "boo", "and", "foo" }
    : -2 { "boo", "and", "foo" }
    o 5 { "b", "", ":and:f", "", "" }
    o -2 { "b", "", ":and:f", "", "" }
    o 0 { "b", "", ":and:f" }

    Pattern类也自带一个静态匹配方法matches(String regex, CharSequence input),但只能进行全字符串匹配并且只能返回是否匹配上的boolean值

    实例:

    String test1 = "Java";
    String test2 = "Java123456";
    
    System.out.println(Pattern.matches("Java",test1));//返回true
    System.out.println(Pattern.matches("Java",test2));//返回false
    

    Matcher类用法

    最后就要过渡到Matcher类了,Pattern类中的matcher(CharSequence input)会返回一个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));
    

    这里介绍下组的概念:组是用括号划分的正则表达式,可以根据组的编号来引用这个组。组号为0表示整个表达式,组号为1表示被第一对括号括起的组,依次类推,例如A(B(C))D,组0是ABCD,组1是BC,组2是C。

    但是类似于(?:pattern)格式的子表达式不能算是一个分组。

    通过(?java)这种形式可以给分组命名,其中<>中就是分组的名称

    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);
    

    总结

    暂时就记录这么多,需要的时候再总结。

  • 相关阅读:
    bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)
    洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆
    CF 438 E & bzoj 3625 小朋友和二叉树 —— 多项式开方
    Codeforces 447
    Codeforces 1099
    Codeforces 991
    Codeforces 994
    Codeforces 989
    Codeforces 1084
    xj膜你赛(n-1)
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/14145325.html
Copyright © 2011-2022 走看看