正则表达式(韩)

正则表达式

介绍

  1. 一个正则表达式,就是用某种模式去匹配字符串的一个公式,很多人因为他们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的,而且,一旦你弄懂他们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成
  2. 这里要特别强调,正则表达式不是只有java才有,实际上很多编程语言都支持正则表达式进行字符串操作!比如:javascript,php,java…
public class Regexp_ {
   
    public static void main(String[] args) {
   
        String str = "1998年12月8日,第二代Java平台的企业版J2EE发布。" +
                "1999年6月,Sun公司发布了第二代Java平台(简称为Java2)" +
                "的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版)" +
                ",应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard " +
                "Edition,Java 2平台的标准版),应用于桌面环境;J2EE(" +
                "Java 2Enterprise Edition,Java 2平台的企业版)," +
                "应用于基于Java的应用服务器。Java 2平台的发布,是Java发展" +
                "过程中最重要的一个里程碑,标志着Java的应用开始普及。";
        //提取文中的所有英文单词
        //(1)传统方式:采用遍历方式,代码量大,效率不高
        //(2)正则表达式技术
        //1.先创建一个Pattern对象,模式对象,可以理解成为就是一个正则表达式对象
        //Pattern pattern = Pattern.compile("[a-zA-Z]+");
        //数字
        //Pattern pattern = Pattern.compile("[0-9]+");
        //数字和英文单词
        Pattern pattern = Pattern.compile("([0-9]+)|([a-zA-Z]+)");
        //2.创建一个匹配器对象
        //理解: matcher 匹配器按照 pattern(模式/样式),到str中去匹配
        //找到返回true,否则就返回false
        Matcher matcher = pattern.matcher(str);
        //3.可以开始循环匹配
        while (matcher.find()){
   
            //匹配内容,文本,放到 matcher.group(0) 中
            System.out.println("找到:"+matcher.group(0));
        }
    }
}

正则表达式底层实现

实例分析

为让大家对正则表达式底层实现有一个直观的映像,给大家举个实例

给你一段字段串(文本),请找出所有四个数字连在一起的子串,比如:应该找到 1998 1999 3443 9889 ===> 分析底层实现

public class RegTheory {
   
    public static void main(String[] args) {
   
        String str = "1998年12月8日,第二代Java平台的企业版J2EE发布。" +
                "1999年6月,Sun公司发布了第二代Java平台(简称为Java2)" +
                "的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版)" +
                ",应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard " +
                "Edition,Java 2平台的标准版),应用于桌面环境;J2EE(" +
                "Java 2Enterprise Edition,Java 2平台的企业版)," +
                "应用于基于Java的应用服务器3443。Java 2平台的发布,是Java发展" +
                "过程中最重要的一个里程碑,标志着Java的应用开始普及9889。";
        //说明
        //1. \\d  表示一个任意的数字(0-9)
        String regStr = "\\d\\d\\d\\d";
        //2.创建模式对象[即正则表达式对象]
        Pattern pattern = Pattern.compile(regStr);
        //3.创建匹配器
        //说明 :创建匹配器 matcher ,按照正则表达式的规则,去匹配 str字符串
        Matcher matcher = pattern.matcher(str);
        //开始匹配
        /*
        * matcher.find() 完成的任务
        1. 根据指定的规则,定位满足规则的子字符串(比如1999)
        2. 找到后,将 子字符串的**开始的索引**记录到 matcher 对象的属性
          int[] groups;  groups[0]=0(groups[0]的值会改变,每一个符合规则的子字符串开始的索引)
          把该子字符串的结束的 **索引+1**的索引值 记录到groups[1]
          * (groups[1]的值会改变,每一个符合规则的子字符串结束的索引+1)=4
        3. 同时记录oldLast 的值为 子字符串的结束的 索引+1 的索引值 ,
          即4。即下次执行find()方法时,就从35开始匹配
        *
        *
        *matcher.group(0) 完成的任务
        public String group(int group) {
            if (first < 0)
                throw new IllegalStateException("No match found");
            if (group < 0 || group > groupCount())
                throw new IndexOutOfBoundsException("No group " + group);
            if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
                return null;
            return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
        }
        1. 根据groups[0]=0 和 groups[1]=4 的记录的位置,
        *从content 开始截取子字符串返回的值 就是  [0,4)   左闭右开,
        *即包含  0  但是不包含   4
        2. 如果再次执行find方法,仍然按照上面分析来执行
        * */
        while (matcher.find()){
   
            System.out.println(matcher.group(0));
        }
    }
}

什么是分组:正

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值