Java中的正则表达式

时间:2022-11-11 14:43:38

前言

  • 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。
  • 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
  • 通过正则表达式处理字符串复杂的查找/替换/匹配/分割工作。

实例

概念

使用单个字符串来描述/匹配一系列符合某个语法规则的字符串

步骤
  1. 通过大量的字符串找规律定义规则。
  2. 使用这种规则去匹配新的字符串。
  3. 匹配成功作出相应的操作(匹配 查找 替换 分割)。
工具

Regexper

字符

正则表达式由两种基本字符组成
原义字符:字符本身就是一个正则 \t \n \r \f
元字符: * + ? $ ^ () [] {}...

对正则表达式进行分类:

  • 字符类: [abc] 将字符进行归类,可以出现[]中的其中一个 对abc其中一个进行匹配
    [^abc] 对不是abc的字符进行匹配

  • 范围类:
    [a-z] 表示代表a-z中的一个字符
    表示所有的英文字母和数字 [a-zA-Z0-9]
  • 预定义类:
    \d == [0-9] 数字
    \D == [^0-9] 非数字
    空白字符:[ \t\n\x0B\f\r] == \s
    [^ \t\n\x0B\f\r] == \S
    [a-zA-Z0-9] \w
    [^a-zA-Z0-9] \W
    . 任何字符(与行结束符可能匹配也可能不匹配)

  • 边界字符
    ^:以XXX开头
    $:以XXX结尾
    \b:单词边界
    \B:非单词边界

  • 量词
    ?:出现0次或者1次
    +:出现1次或者多次
    *:出现任意次
    {n}:出现正好n次
    {n,m}出现n-m次
    {n,}出现至少n次

  • 分组 ()
    如何让Jack出现至少3次
    (Jack){3,}
    忽略分组:每一组能够分组,但是没有编号 ?:

    Ja(ck|Love)Kitty

  • 反向引用
    利用分组的编号进行反向引用
    反向引用使用$,必须先分组
    2018-04-27 ==> 04/27/2018

在Java中的应用
   1.字符串查找操作  Pattern和Matcher
   2.字符串匹配操作 字符串的matches()方法
   3.字符串替换操作 字符串的replaceAll()和replaceFirst()方法
   4.字符串分割 split() 方法

测试

验证手机号
匹配如下四个手机号
18079243050
15160869850
18765068050
14235452850
- 分析:
1.以1开头
2.一共11位
3.50结尾
4.倒数第三位是 0 或者 8
public class Test424_1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入手机号");
        String s  = input.next();
        String regex = "^1[0-9]{7}(0|8)(50)$";
        System.out.println(s.matches(regex));   
    }
}
日期替换
   2016/03/05
   demo/07/ss
   1993/08/05
   2016/11/24
   12345/23/45678
   12345/24/3356
   1993-08-05
   将正确的日期格式替换为03-05-2016
- 分析:
1.原日期为年月日
2.替换日期为月日年
3.利用分组()和$反向引用
public class Test424_3 {
    public static void main(String[] args) {
        String s =  " 2016/03/05 "
                +   " demo/07/ss"
                +   " 1993/08/05"
                +   " 2016/11/24"
                +   " 12345/23/45678"
                +   " 12345/24/3356"
                +   " 1993-08-05";
        String regex  ="\\b(\\d{4})[/-](\\d{2})[/-](\\d{2})\\b";
        System.out.println(s.replaceAll(regex, "$2-$3-$1"));
    }
}

推荐书籍:《正则表达式必知必会》

以上