Fork me on GitHub

Java正则表达式使用

前言

1.什么是正则表达式?

正则表达式是一种可以用于模式匹配和替换的强有力的工具。

2.为什么要使用正则表达式?有什么优点缺点?

正则表达式在参数校验、参数匹配方面可以发挥重大作用。

优点:更少的代码,更高的效率。

缺点:需要一定时间的学习及记忆,不然理解晦涩。

正则表达式

符号及其含义

下表是正则表达式的所有符号及含义。

常用的符号
.表示任意字符
\s空格字符(空格键, tab, 换行, 换页, 回车)
\S非空格字符([^\s])
\d一个数字,(相当于[0-9] )
\D一个非数字的字符,(相当于[^0-9] )
\w一个单词字符(word character) (相当于 [a-zA-Z_0-9] )
\W一个非单词的字符,[^\w]
^一行的开始
$一行的结尾
\b一个单词的边界
\B一个非单词的边界
\G前一个匹配的结束
[]匹配方括号内的一个字符
例如:[abc] 表示字符 a,b,c 中的任意一个(与 a|b|c 相同)
[a-zA-Z]表示从a到z或A到Z当中的任意一个字符
表示次数的符号
*重复零次或更多次
例如:a* 匹配零个或者多个 a
+重复一次或更多次
例如:a+ 匹配一个或者多个 a
?重复零次或一次
例如:a? 匹配零个或一个 a
{n}重复n次
例如:a{4}匹配4个a
{n,}重复 n 次或更多次
例如:a{4,} 匹配至少 4 个 a
{n,m}重复n到m次
例如:a{4,10} 匹配 4~10 个 a

正则表达式实例

java 正则表达式通过 java.util.regex 包下的 Pattern 类与 Matcher 类实现:

正则表达式使用总共分三步:

  1. 构造一个模式.
    Pattern p=Pattern.compile(“[a-z]*”);
  2. 建造一个匹配器
    Matcher m = p.matcher(str);
  3. 进行判断,得到结果
    boolean b = m.matches();

Matcher 类提供三个匹配操作方法,三个方法均返回 boolean 类型,当匹配到 时返回 true,没匹配到则返回 false

  1. m.matches()

    matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回 true

  2. m.lookingAt()

    lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返 回 true

  3. m.find()

    find()对字符串进行匹配,匹配到的字符串可以在任何位置

Matcher 类的其他方法:

  1. int groupcount()

    返回此匹配器模式中的捕获组数。

  2. String replaceAll(String replacement)

    用给定的 replacement 全部替代匹配的 部分

  3. String repalceFirst(String replacement)

    用给定的 replacement 替代第一次匹 配的部分

  4. appendReplacement(StringBuffer sb,String replacement)

    根 据 模 式 用 replacement 替换相应内容,并将匹配的结果添加到 sb 当前位置之后

  5. StringBuffer appendTail(StringBuffer sb)

    将输入序列中匹配之后的末尾字串 添加到 sb 当前位置之后.

  6. group(n)

    0 代表永远都是匹配整个表达式的字符串的那部分 n<>0 时代表 第 n 组匹配的部分

正则表达式的用法

  1. 字符匹配

    1
    2
    3
    4
    Pattern p = Pattern.compile(expression); // 正则表达式 
    Matcher m = p.matcher(str); // 操作的字符串
    boolean b = m.matches(); //返回是否匹配的结果
    System.out.println(b);
  2. 分割字符串

    1
    2
    Pattern pattern = Pattern.compile(expression); //正则表达式
    String[] strs = pattern.split(str); //操作字符串 得到返回的字符串数组
  3. 替换字符串

    1
    2
    3
    Pattern p = Pattern.compile(expression); // 正则表达式 
    Matcher m = p.matcher(text); // 操作的字符串
    String s = m.replaceAll(str); //替换后的字符串
  4. 查找替换指定字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Pattern p = Pattern.compile(expression); // 正则表达式 
    Matcher m = p.matcher(text); // 操作的字符串
    StringBuffer sb = new StringBuffer();
    int i = 0;
    while (m.find()) {
    m.appendReplacement(sb, str);
    i++; //字符串出现次数
    }
    m.appendTail(sb);//从截取点将后面的字符串接上
    String s = sb.toString();
  1. 查找输出字符串

    1
    2
    3
    4
    5
    6
    7
    Pattern p = Pattern.compile(expression); // 正则表达式 
    Matcher m = p.matcher(text); // 操作的字符串
    while (m.find()) {
    //m.start() 返回匹配到的子字符串在字符串中的索引位置.
    //m.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
    //m.group()返回匹配到的子字符串
    }

常用的正则表达式

  1. 手机号码校验

    1
    2
    3
    4
    5
       public static boolean isPhone(String str) {
    Pattern p = Pattern.compile("^[1][3,5,7,8]+\\d{9}"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  1. 邮箱地址校验

    1
    2
    3
    4
    5
       public static boolean isEmail(String str) {
    Pattern p = Pattern.compile("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  1. IP地址校验

    1
    2
    3
    4
    5
       public static boolean isIPv4(String str) {
    Pattern p = Pattern.compile("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  1. 是不是汉字

    1
    2
    3
    4
    5
       public static boolean isChinese(String str) {
    Pattern p = Pattern.compile("^[\\u4e00-\\u9fa5]+$"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  1. QQ号校验

    1
    2
    3
    4
    5
       public static boolean isQQ(String str){
    Pattern p = Pattern.compile("[1-9][0-9]{4,13}"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  2. 身份证号校验

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static boolean isIDNumber(String IDNumber) {
    if (IDNumber == null || "".equals(IDNumber)) {
    return false;
    }
    // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
    String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
    "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
    boolean matches = IDNumber.matches(regularExpression);
    //详细校验略
    return matches;
    }
  1. 邮编校验

    1
    2
    3
    4
    5
       public static boolean isMail(String str) {
    Pattern p = Pattern.compile("[1-9]\\d{5}(?!\\d)"); //正则表达式
    Matcher m = p.matcher(str); //操作的字符串
    return m.matches();
    }
  1. 其他

    其他常用校验不在一一说明。

    可以通过 https://github.com/JavaZWT/sakuratears 获取。

结语

如果我们能够熟练掌握正则表达式,一定会对我们的开发提供很大的帮助。

正则表达式整体上相对于代码来说是比较晦涩的,用好它需要一定的功力及学习能力。




-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

SakuraTears wechat
扫一扫关注我的公众号
您的支持就是我创作的动力!
0%