正则表达式(Java)

正则表达式


精确匹配

一一对应,但是特殊字符要用"/"转义
匹配中文字符(utf-8),用\u####十六进制编码

匹配任意字符

  • . : 匹配任意字符(仅限一个字符)

  • \d : 匹配一个数字(仅限一个字符)

  • \w : 匹配一个字母、数字或者下划线(不能匹配空格、#等特殊字符)

  • \s : 匹配空格字符(空格 与制表符\t)

  • \D : 匹配一个非数字

  • \W : 匹配非字母、数字、下划线

  • \S : 匹配非空格字符


重复匹配

  • 修饰符 * : 可以匹配0或多个字符

如\d* 可以匹配0到多个数字

  • 修饰符 + : 可以匹配至少一个字符

如\d* 可以匹配1个以上的数字

  • 修饰符 ? : 可以匹配0或1个字符

如\d? 可以匹配0或1个数字

  • 修饰符 {m,n} : 可以精确匹配m到n个字符

如\d{3,5} 可以匹配3到5个数字
如果没有上限{m,} 可以匹配至少m个字符


复杂匹配规则

  • 匹配开头和结尾
    • ^ : 表示开头
      $ : 表示结尾

    如^A\d{3}$ 可以匹配 A001、A380

  • 指定匹配范围
    • […] : 指定匹配范围

    [123456789] : 可以匹配1-9
    [1-9] : 简写匹配1-9
    匹配十六进制数:[0-9a-fA-F]

    • [^…] : 指定排除范围

    [^1-9] : 可以排除1-9

  • 或规则匹配
    | : 链接两个正则规则,表示或关系

    1|9 可以匹配1也可以匹配9


分组匹配

  • regex类的使用
    Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})"); //用正则表达式获取patter对象
    patter.matcher("010-12345678").matches();//判断是否符合样式 返回值为布尔类型
    Matcher matcher = pattern.matcher("010-12345678");//获取matcher对象
    if (matcher.matches()){         //判断是否匹配成功
    String whole = matcher.group(0);//"010-12345678" 0表示匹配的整个字符串
    String first = matcher.group(1);//"010" 1表示匹配的的第一个子串
    String second = matcher.group(2);//"12345678" 2表示匹配的第二个子串
    }
    
    第几个子串由括号()确定

非贪婪匹配

  • 正则表达式默认使用贪婪匹配:
    任意一个规则,总是尽可能的多的往后匹配
  • 修饰符 ? :
    修饰后使用非贪婪匹配: 尽可能少的匹配

分割、搜索、替换

  • 用spilt(正则字符串)分割字符串
    s.split(正则字符串) 按正则匹配分割字符串
  • 用正则字符串搜索字符串
//示例
public class Main {
    public static void main(String[] args) {
        String s = "the quick brown fox jumps over the lazy dog.";
        Pattern p = Pattern.compile("\\wo\\w");
        Matcher m = p.matcher(s);
        while (m.find()) {
            String sub = s.substring(m.start(), m.end());
            System.out.println(sub);
        }
    }
}
  • 用replaceAll(正则字符串,待替换的字符串)
//示例
public class Main {
    public static void main(String[] args) {
        String s = "The     quick\t\t brown   fox  jumps   over the  lazy dog.";
        String r = s.replaceAll("\\s+", " ");
        System.out.println(r); // "The quick brown fox jumps over the lazy dog."
    }
}
  • 反向引用
    如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个xxxx,这个时候,使用replaceAll()的时候,我们传入的第二个参数可以使用$1、$2来反向引用匹配到的子串。
示例
public class Main {
    public static void main(String[] args) {
        String s = "the quick brown fox jumps over the lazy dog.";
        String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
        System.out.println(r);
    }
}

上述代码的运行结果是:

the quick brown fox jumps <b>over</b> the <b>lazy</b> dog.

它实际上把任何4字符单词的前后用<b>xxxx</b>括起来。实现替换的关键就在于"<b>$1</b>",它用匹配的分组子串([a-z]{4})替换了$1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值