第十一章 正则表达式

11 正则表达式

符合一定规则的表达式。

1、作用

用于专门操作字符串。

String中提供了matches(String regex)方法,用于通知此字符串是否匹配给定的正则表达式。

2、特点

用一些特定的符号,来表示一些代码操作,这样就简化了书写。

3、好处

可以简化对字符串的复杂操作。

4、弊端

符号定义越多,正则表达式越长,阅读性越差。

5、对QQ号码进行校验,5-15位,只能是数字。

public class QQ {

public static void main(String[] args) {

String qq="81276490";
        String regex = "[1-9][0-9]{4,14}";
        boolean b = qq.matches(regex);
        
        if (b) {
            System.out.println("正确");
        }else {
            System.out.println("错误");
        }
    }
}
其中:

[1-9]表示只能取1到9之间的数。

[0-9]表示只能取0到9之间的数。

{4,14}表示最少重复4次,最多重复14次。

11.1 正则表达式规则(只列出了一些常用的)

1、字符类
[abc] abc(简单类)
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azA
Z,两头的字母包括在内(范围)

例如:  String s = "a";
            String regex = "[a,b,c]";
            boolean b = s.matches(regex);
            System.out.println(b);

2、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

例如:String s = "a9";
          String regex = "[a-zA-Z]\\d";
          boolean b = s.matches(regex);
          System.out.println(b);

3、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
4、Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

例子:字母后面的数字出现0次或多次。

String s = "a98";
        String regex = "[a-zA-Z]\\d*";
        boolean b = s.matches(regex);
        System.out.println(b);

5、Logical 运算符
XY X 后跟 Y
X|Y XY
(X) X,作为捕获组

6、匹配手机号:13...,15...,18...

public static void checkTel(){
        String s = "13812930477";
        String regex = "1[358]\\d{9}";
        boolean b = s.matches(regex);
        System.out.println(b);
    }

11.2 正则表达式切割字符串

1、用空格切割字符串,空格出现的次数不确定。

public class SplitDemo {

public static void main(String[] args) {

splitDemo();
    }
    
    public static void splitDemo(){
        
        String s = "zhangsan  lisi      wangwu";
        String regex = " +";
        String[] arr = s.split(regex);
        System.out.println(arr.length);
        
        for (String string : arr) {
            System.out.println(string);
        }
    }
}

2、用.来切割字符串

public static void splitDemo(){
        
        String s = "zhangsan.lisi.wangwu";
        String regex = ".";
        String[] arr = s.split(regex);
        System.out.println(arr.length);
        
        for (String string : arr) {
            System.out.println(string);
        }
    }

输出结果数组长度为0。

因为"."在正则表达式中是特殊符号,所以需要时要转义一下"\\."

3、用叠词来切割字符串

public static void splitDemo(){
        
        String s = "aczzukksiyyyhiiiiiok";
        String regex = "(.)\\1+";
        String[] arr = s.split(regex);
        System.out.println(arr.length);
        
        for (String string : arr) {
            System.out.println(string);
        }
    }

为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成。组都有编号,从1开始。想要使用已有的组可以通过\编号的形式来获取。

11.3 正则表达式替换字符串

用到了String的replaceFirst(String regex, String replacement)方法。

1、将字符串中的数字出现4次或以上时替换成*。例如dada23325435f123dsf88943der3442

public class replaceAllDemo {

public static void main(String[] args) {

String s = "dada23325435f123dsf88943der3442";
        String regex = "\\d{4,}";
        replaceAllDemo(s, regex, "*");
    }

public static void replaceAllDemo(String str,String regex,String newStr){
        
        str = str.replaceAll(regex, newStr);
        System.out.println(str);
    }
}

结果:dada*f123dsf*der*

2、将字符串中的叠词替换成#。例如aczzukksiyyyhiiiiiok

public class replaceAllDemo {

public static void main(String[] args) {

String s = "aczzukksiyyyhiiiiiok";
        String regex = "(.)\\1+";
        replaceAllDemo(s, regex, "#");
    }

public static void replaceAllDemo(String str,String regex,String newStr){
        
        str = str.replaceAll(regex, newStr);
        System.out.println(str);
    }
}

结果:ac#u#si#h#ok

3、将字符串中的叠词替换成一个。

public class replaceAllDemo {

public static void main(String[] args) {
      
        String s = "aczzukksiyyyhiiiiiok";
        String regex = "(.)\\1+";
        replaceAllDemo(s, regex, "$1");
    }

public static void replaceAllDemo(String str,String regex,String newStr){
        
        str = str.replaceAll(regex, newStr);
        System.out.println(str);
    }
}

结果:aczuksiyhiok

11.4 正则表达式获取子串


1、操作步骤

  • 将正则表达式封装成对象Pattern
  • 让正则表达式对象和要操作的字符串相关联
  • 关联后,获取正则匹配引擎
  • 通过引擎对符合规则的子串进行操作

2、从字符串中截取连续3个字符的子串

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SubStringDemo {

public static void main(String[] args) {

subStringDemo();
    }

public static void subStringDemo(){
        
        String s = "hei ma wo lai le,yi ying yao hao hao xue xi";
        String regex = "\\b[a-z]{3}\\b";
        
        //将正则表达式封装成对象
        Pattern p = Pattern.compile(regex);
        //正则和要操作的字符串相关联
        Matcher m = p.matcher(s);
        //将规则作用到字符串上,并进行符合规则的子串查找
        while (m.find()) {
            System.out.println(m.group());
            
        }
    }
}

11.5 网页爬虫

1、 获取指定网页中的邮件地址

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SubStringDemo {

public static void main(String[] args) throws IOException {

getMails();
    }
    
    public static void getMails() throws IOException{
        URL url = new URL("http://192.168.1.11:8080/myweb/text.html");
        URLConnection conn = url.openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        
        String line = null;
        String mailReg = "\\[email protected]\\w+(\\.\\w+)+";
        
        //将正则表达式封装成对象
        Pattern p = Pattern.compile(mailReg);
        
        while (null!=(line=br.readLine())) {
            
            //正则和要操作的字符串相关联
            Matcher m = p.matcher(line);
            
            //将规则作用到字符串上,并进行符合规则的子串查找
            while (m.find()) {
                System.out.println(m.group());
            }
            
        }
        
        br.close();
    }
}

时间: 2024-12-30 00:05:51

第十一章 正则表达式的相关文章

javascript高级程序设计 第十一章--DOM扩展

javascript高级程序设计 第十一章--DOM扩展DOM最主要的扩展就是选择符API.HTML5和Element Traversal Selectors API:定义了两个方法 querySelector() 和 querySelectorAll(),能够基于CSS选择符从DOM中取得元素.querySelector()方法接收一个CSS选择符,返回该模式匹配的第一个元素,querySelectorAll()接收的参数一样,但是返回NodeList实例: matchesSelector()

c++ primer 5th 笔记:第十一章

第十一章:关联容器 笔记 1. 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 2. 关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set.map中的元素是一些关键字-值对:关键字起到索引的作用,值则表示与索引相关联的数据.set中每个元素只包含一个关键字:set支持高效的关键字查询操作--检查一个给定关键字是否在set中. 3. 当从map中提取一个元素时,会得到一个pair

zabbix专题:第十一章 zabbix proxy分布式监控配置

zabbix专题:第十一章 zabbix proxy分布式监控配置             对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.co zabbix proxy分布式监控配置 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix proxy可以非常简便的实现了集中式.分

第十一章 执行查询算法

第十一章      执行查询算法 基本概念: 三类查找方法:线性查找.树形查找.哈希表查找 动态查找表:在查找的同时,对表做修改操作(如插入和删除),则相应的表称为动态查找表 静态查找表:与动态查找表相反 查找过程中对关键字需要执行的平均比较次数(也称平均比较长度作为衡量一个查找算法优劣的标准 平均比较长度: 其中:n是结点的个数:pi是查找第i个结点的概率.若不特别申明,认为每个结点的查找概率相等,都为1/n:ci是找到第i个结点所需进行的比较次数. 线性查找: 基本思想:从表的一端开始,顺序

Linux与云计算——第二阶段 第一十一章:代理Proxy服务器架设—Squid代理服务器正向代理和客户端配置

Linux与云计算--第二阶段Linux服务器架设 第一十一章:代理Proxy服务器架设-Squid代理服务器正向代理和客户端配置 安装Squid 安装Squid来配置代理服务器. [1] 这是一个通用的转发代理配置 [[email protected] ~]# yum -y install squid [[email protected] ~]# vi /etc/squid/squid.conf # line 26: 添加一条新的ACL acl lan src 192.168.96.0/24

第十一章 读书笔记

第十一章  Linux驱动程序中的 并发控制 并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资 源〈如硬件资摞.程序中的全局变量.静态变量等〉的访问很容易导致竞态条件( race conditions). 自旋锁并不关心锁定的|临界区究竟是怎样的操作,不管是读还是写,都只允许同时只有一个执 行单元可以极取自旋锁, 即使有多个单元同时读取临界区资源也会被锁住.实际上,对于并发访问 共享资源时,多个执行单元同时读取它是不会有任何问题的.为了解决这个问题,自旋

JS复习:第十、十一章

第十章 NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点,但它并不是Array实例,将其转化为数组的方法: function converToArray(nodes){ var array = null; try{ array = Array.prototype.slice.call(nodes,0); //slice方法的参数 }catch(ex){ array = new Array(); for(var i = 0,len = nodes.length

第十一章 异常,日志,断言和调试

第十一章 异常,日志,断言,调试 由于程序的错误或一些外部环境的影响造成用户数据的丢失,用户就有可能不再使用这个程序了.为了避免,应该做到以下几点: 向用户通告错误 保存所有的操作结果 允许用户以适当的形式退出程序. 11.1 处理异常 当由于出现错误而使得某些操作没有完成,程序应该: 返回到一种安全状态,并能够让用户执行一些其他命令:或者 允许用户保存所有操作的结果,以适当的方式终止程序 异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种错误的处理器.程序中可能出现的错误和问题: 用

jQuery第十一章

第十一章 一.jQuery性能优化 1.使用最新版本的jQuery类库. 2.使用合适的选择器 (1)$(“#id”) :使用id来定位DOM元素是最佳提高性能的方式. (2)$(“p”) :标签选择器的性能也不错. (3)$(“.class”) :这种方法比较复杂 (4)$(“[attribute = value]”) :利用属性来定位DOM元素会使用DOM搜索的方式来达到效果. (5)$(“ : hidden”) :利用伪选择器会带来较大的性能问题. 3.缓存对象. 4.循环DOM操作. 5