栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

正则表达式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

正则表达式

  正则表达式就是描述字符串的规则。jdk 内置正则表达式引擎:java.util.regex

1. 示例

  判断用户输入的年份是否是 19xx 年

  写法一:

package cn.itcast.order.pojo;

public class Demo {
    public static void main(String[] args) {
        String input = "1990";
        boolean is19xx = input.matches("19\d\d");
        System.out.println(is19xx);
    }
}

  写法二:

package cn.itcast.order.pojo;

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

public class Demo {
    static Pattern pattern = Pattern.compile("19\d\d");
    
    public static void main(String[] args) {
        Matcher matcher = pattern.matcher("1990");
        boolean matches = matcher.matches();
        System.out.println(matches);
    }
}

  写法二把正则表达式编译为 Pattern 对象,适用于反复使用这个正则表达式的情形

2. 基本匹配规则
Java 字符串正则表达式可以匹配的字符串说明
“abc”“abc”精确匹配
“a\&c”“a&c”精确匹配,特殊字符需要转义。有一些字符不需要转义,但是加上也没有错
“a.c”“abc”
“a&c”
符号 . 来匹配一个任意字符
“00\d”"007"
“008”
符号 d 可以匹配一个数字
“00\D”“00A”
“00#”
符号 D 可以匹配一个非数字
“java\w”“javac”
"java8"
“java_”
符号 w 可以匹配一个字母、数字或下划线
“java\W”“java!”
"java "
符号 W 可以匹配一个非字母、数字或下划线
“A\sB”“A B”
“A  B”
符号 s 可以匹配一个空白字符(tab 键也算一个空白字符)
“A\SB”"A&B"
ABB
符号 S 可以匹配一个非空白字符
“A\d*”“A”
"A1"
A007
修饰符 * 可以匹配任意个字符,在这里 * 修饰的是 d
“A\d+”"A1"
“A007”
修饰符 + 可以匹配至少一个字符,在这里 + 修饰的是 d
“A\d?”“A”
“A1”
修饰符 ? 可以匹配 0 个或 1 个字符,在这里 ? 修饰的是 d
“\d{6}”"123456"
“999999”
修饰符 {n} 可以匹配 n 个字符,在这里 {6} 修饰的是 d
“\d{3,5}”"123"
“12345”
修饰符 {n,m} 可以匹配 n-m 个字符,在这里 {3,5} 修饰的是 d
“\d{3,}”"123"
"1234"
“123456789”
修饰符 {n,} 可以匹配至少 n 个字符,在这里 {3,} 修饰的是 d

注意:

    Java 字符串的正则表达式要多加一个 ,因为 也要转义正则表达式符号的大写与小写所代表的含义是相反的
3. 复杂匹配规则
Java 字符串正则表达式可以匹配的字符串说明
“^A\d{3}$”"A001"
“A999”
用 ^ 和 $ 表示正则表达式的开头和结尾。在 Java 中这两个字符可以加,也可以不加
“[abc]1”"a1"
"b1"
“c1”
[…] 可以匹配在这个范围内的一个字符
“[a-f]1”"a1"
"b1"
“f1”
同上
“[a-f0-9]{6}”“1a2b3c”
“ffffff”
“ff0102”
同上
“[a-f0-9_]{6}”“1a_b3c”
"_fffff"
“ff010_”
同上
“[^0-9]{6}”“abcdef”
"$$$$$$"
“A-B-C-”
[^…] 表示可以匹配非这个范围内的字符。这里是除了 0-9 的数字都可以匹配
“java|php”“java”
“php”
“AB|CD” 可以匹配 AB 或 CD
“learn\s(java|php)”“learn java”
“learn php”
同上
4. 分组匹配规则

  我们可以通过小括号进行分组,然后提取出每组的内容

  正则表达式:String regex = "^\d{3,4}\-\d{6,8}$";
  上面的正则表达式只能判断给定的字符串能否匹配,但是不能提取每个部分匹配的字符串,这时候就要用小括号来进行分组匹配:String regex = "^(\d{3,4})\-(\d{6,8})$";

  我们可以通过方式二的 Matcher.group(n) 来提取子串

package cn.itcast.order.pojo;

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

public class Demo {
    static Pattern pattern = Pattern.compile("^(\d{3,4})\-(\d{6,8})$");
    
    public static void main(String[] args) {
        Matcher matcher = pattern.matcher("010-12345678");
        if (matcher.matches()) {
            String whole = matcher.group(0); // 0 表示匹配整个字符串
            String firstString = matcher.group(1); // 1 表示匹配第一个带括号的子串
            String secondString = matcher.group(2); // 2 表示匹配第二个带括号的子串
            System.out.println(whole); // 010-12345678
            System.out.println(firstString); // 010
            System.out.println(secondString); // 12345678
        }
    }
}
5. 非贪婪匹配

  判断数字末尾 0 的个数

“123000”:3 个 0“10100”:2 个 0“1001”:0 个 0

  正则表达式默认使用贪婪匹配,尽可能多的向后匹配

package cn.itcast.order.pojo;

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

public class Demo {
    static Pattern pattern = Pattern.compile("^(\d+)(0*)$");

    public static void main(String[] args) {
        Matcher matcher = pattern.matcher("1230000");
        if (matcher.matches()) {
            String firstString = matcher.group(1);
            String secondString = matcher.group(2);
            System.out.println(firstString); // "1230000"
            System.out.println(secondString); // ""
        }
    }
}

  我们使用 ? 实现非贪婪匹配

package cn.itcast.order.pojo;

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

public class Demo {
    static Pattern pattern = Pattern.compile("^(\d+?)(0*)$");

    public static void main(String[] args) {
        Matcher matcher = pattern.matcher("1230000");
        if (matcher.matches()) {
            String firstString = matcher.group(1);
            String secondString = matcher.group(2);
            System.out.println(firstString); // "123"
            System.out.println(secondString); // "0000"
        }
    }
}

注意:? 既可以表示匹配 0 个或 1 个字符,也可以表示非贪婪匹配

6. 利用正则表达式分割字符串为数组

  字符串的 split 方法,将一个字符串分割为数组

package cn.itcast.order.pojo;

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        String[] split1 = "a b c".split("\s");
        System.out.println(Arrays.toString(split1)); // [a, b, c]

        String[] split2 = "a b  c".split("\s+");
        System.out.println(Arrays.toString(split2)); // [a, b, c]

        String[] split3 = "a, b ; ; c".split("[\,\s\;]+");
        System.out.println(Arrays.toString(split3)); // [a, b, c]
    }
}
	private static final String regEx_script = "]*?>[\s\S]*?<\/script>"; // 定义script的正则表达式
    private static final String regEx_style = "]*?>[\s\S]*?<\/style>"; // 定义style的正则表达式
    private static final String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
    private static final String regEx_space = "\s*|t|r|n";// 定义空格回车换行符
    private static final String regEx_w = "]*?>[\s\S]*?<\/w[^>]*?>";//定义所有w标签
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号