zoukankan      html  css  js  c++  java
  • java之正则表达式

    1.正则表达式

    1)什么是正则表达式

    正则表达式用来定义一个搜索模式的字符串,可以用于搜索,编辑和操作文本,正则表达式对文本的分析或修改过程为:首先应用文本字符串,它会以定义的模式从左到右匹配文本,并且每个源字符只匹配一次。

    2)示例

    正则表达式 说明
    this is string text 精确匹配字符串"this is string text"
    thiss+iss+strings+text 匹配this后跟一个或多个字符串,后跟is,然后is后面跟一个或多个字符串,然后跟string,然后跟一个或多个字符串,然后跟text
    ^d+(.d+)? ^表示匹配字符串的开始,d+匹配一个或多个数字,?表示小括号内的语句是可选的,.匹配.,小括号表示分组

    2.正则表达式的编写规则

    1.常用的匹配符号

    正则表达式 说明
    . 匹配所有单个字符,除了换行符(linux换行符为 ,windows换行符为 )
    ^regex 匹配以regex开头
    regex$ 匹配以regex结尾
    [abc] 匹配a或b或c
    [abc][xyz] 匹配a或b或c,后面跟x或y或z
    [^abc] 匹配不包含a或b或c
    [a-z0-9] 范围匹配,匹配a到z和数字0-9之间的一个值
    AB 匹配A然后后面跟着B
    A|B 匹配A或者B

    2.元字符

    元字符表示一个预定义的字符。

    正则表达式 说明
    d 匹配一个数字,是[0-9]的简写
    D 匹配一个非数字,是[^0-9]的简写
    s 匹配一个空格
    S 匹配一个非空格
    w 匹配一个单词字符(字母,数字,下划线)
    W 匹配一个非单词字符

    3.限定符

    限定符用来表示一个元素可以出现的频率。

    正则表达式 说明 示例
    * 匹配0个或多个 x*表示匹配0个或多个x,.*代表任意字符串
    + 匹配1个或多个 x+表示匹配1个或多个x
    ? 匹配1个或者0个 x?表示匹配0个x或者1个x
    {x} 只匹配x个字符 d{3}表示匹配3个数字
    {x,y} 表示匹配大于等于x并且小于等于y d{1,4}匹配至少一个至多4个数字
    *? 如果?是限定符*或+或?或{}后的第一个字符,表示非贪婪模式,尽可能少的匹配字符  

    4.分组和反向引用

    小括号()可以对正则表达式进行分组。创建分组会在正则表达式中创建反向引用,反向引用会保存匹配模式分组的字符串片段,这样我们就可以使用这些字符串片段,我们可以使用$来引用分组的反向引用,$0表示匹配完整模式的字符串,$1表示第一个分组的反向引用,以此类推。

    public class Demo02 {
        public static void main(String[] args) {
            /***
             * 去除o和,n和.之间的空格
             * $0:o 和 n .
             * $1:o和n
             * $2:空格
             * $3:,和.
             */
            String s = "Hello , boxiaoyuan .";
            String pattern = "(\w)(\s+)([,.])";
            System.out.println(s.replaceAll(pattern, "$1$3"));
        }
    }

    5.易错点

    [jpg|png]表示匹配j或p或g或p或n或g中的任意一个字符。

    (jpg|png)表示匹配jpg或者png中的一个。

    3.字符串使用正则表达式

    1.内置的字符串正则处理方法

    java中内置四个运行正则表达式的方法,matcher(),split(),replaceFirst(),replaceAll(),relpace方法不支持正则表达式。

    方法 说明
    s.matches("regex") 仅当正则表达式匹配整个字符串时返回true
    s.split("regex") 按匹配的正则表达式切片字符串
    s.replaceFirst("regex") 替换首次匹配的字符串片段
    s.replaceAll("regex") 替换所有匹配的字符

    示例:

    public class Demo02 {
        public static void main(String[] args) {
            System.out.println("boxiaoyuan".matches("boxiaoyuan")); 
            String[] strs = "bo xiao yuan".split("\s");
            for(String str : strs) {
                System.out.println(str);
            }
            
            System.out.println("bo xiao yuan".replaceFirst("\s", "-"));
            
            System.out.println("bo xiao yuan".replaceAll("\s", "-"));
        }
    }

    4.模式和匹配

    java中使用正则表达式需要使用两个类,分别是java.util.regex.Pattern和java.util.regex.Matcher。

    使用方法:

                  第一步:通过正则表达式创建模式对象Pattern。

        第二步:通过模式对象Pattern,根据指定字符串创建匹配对象Macher。

        第三步:通过匹配对象Matcher,根据正则表达式操作字符串。

    示例:

    public class Demo02 {
        public static void main(String[] args) {
            String s = "hello boxiaoyuan!";
            Pattern pattern = Pattern.compile("\w+", Pattern.CASE_INSENSITIVE); // 通过正则表达式创建模式对象Pattern, 不区分大小写
            
            Matcher matcher = pattern.matcher(s); // 根据指定字符串创建匹配对象 matcher
            
            while(matcher.find()) {
                System.out.println("start index:" + matcher.start());
                System.out.println("end index:" + matcher.end());
                System.out.println(matcher.group());
            }
            // 创建第二个模式,用于把空格替换为-
            Pattern replace = Pattern.compile("\s");
            Matcher matcher2 = replace.matcher(s);
            System.out.println(matcher2.replaceAll("-"));
        }
    }
    
    ---------输出结果----------
    start index:0
    end index:5
    hello
    start index:6
    end index:16
    boxiaoyuan
    hello-boxiaoyuan!

    参考:https://segmentfault.com/a/1190000009162306

  • 相关阅读:
    不要在linux上启用net.ipv4.tcp_tw_recycle参数
    Linux如何用查看域名解析
    APP请求超时问题-ios超时-android超时
    写给正在入坑linux系统的伙伴
    产品经理必看书单
    Mysql遍历大表(Mysql大量数据读取内存溢出的解决方法)
    产品上线标准
    测试时间的评估【搬运】
    如何估算测试工作量(一)常规的估算测试工作量的方法
    测试工作量的评估方法
  • 原文地址:https://www.cnblogs.com/zhuzhaoli/p/10732756.html
Copyright © 2011-2022 走看看