正则表达式

正则的应用场景:

  • 密码格式校验、密码匹配校验

  • 字符串匹配

  • 字符串替换

import java.util.regex.Pattern;

public class lamda {
    public static void main(String[] args) throws Exception {
        System.out.println("密码格式正确:"+isRightToInputPassword("aaaaaa"));
        System.out.println("密码格式正确:"+isRightToInputPassword("dongqingDq#123"));
    }
    //构建密码的输入操作理解
    /**@Parmarms: 参数值(输入的式字符串的理解操作)
     * @DEFENATION 定义量
     * 1. 6~16位字符
     * 2.数字
     * 3.大小写字母
     * 4.特殊字符组组合
     * */
    /**
     * 如此循环操作,如何进行理解才是非常关键的操作之一
     * */
    public static boolean isRightToInputPassword(String password) throws Exception{
//        //定义小写的数据判定
//         boolean isLowerCase=false;
//         //定义大写的数据判定
//         boolean isUpperCase=false;
//         //定义特殊字符的数据判定
//         boolean isSpecial=false;
//         //定义数字的数据判定
//         boolean isInt=false;
//         char [] passwordArray= password.toCharArray();
//         int length=passwordArray.length;
//         if (length <6 || length > 16){
//            throw new Exception("对不起,你所输入的字符长度是不合法的");
//        }
//        //对相关的字符串进行设计操作,如何实现是非常必要的理解之一
//        for (char c : passwordArray){
//             if (c>'a' && c<'z'){
//                 isLowerCase = true;
//                 continue;
//             }
//             if (c>'A' && c<'Z') {
//                 isUpperCase=true;
//                 continue;
//             }
//             //构建数字的assidoc数字码来进行求解
//             if (c>48 && c<57){
//                 isInt=true;
//                 continue;
//             }
//             if (c>33 && c<47){
//                 isSpecial=true;
//             }
//        }
//         return isLowerCase && isInt && isSpecial && isUpperCase;
//     }
        return Pattern.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$", password);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    private static final String target="fbcd&dongqing";
    public static void main(String[] args) {
        String name="fbcd&dongqing";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(isRuslt);
    }
}

关于正则表达式的核心就是正则校验的操作形式理解

\xx系正则表达式:

  • \d寻求数字的联合求解(表示一个数字)

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="aaa\\d";
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="aaa5";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(isRuslt);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="aaa\\dbbb";
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="aaa5.1bbb";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(isRuslt);
    }
}

\\d \\d后面跟上两个数字

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="aaa\\d\\d";
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="aaa53";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(isRuslt);
    }
}

\D表示后面跟上一个非数字

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="aaa\\D";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="aaas";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\D\D\D表示长度为3的非数字字符串

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="\\D\\D\\D";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="aaa";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

111\\\D222 表示111和222之间跟上一个非数字

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="111\\D222";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="111t222";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\w表示一个字母(大小写)、数字、下划线

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23\\w417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23_417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\W表示这个位置除了字母,数字,下划线之外所有的特殊字符

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23\\W417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23#417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\s表示匹配一个看不见的符号,即为空格制表符等

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23\\s417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23 417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23\\s417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23 417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\S表示一个看得见的符号

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23\\S417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23a417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

\num后面跟数字表示匹配第几个括号的内容

  • 直接进行匹配然后添加相关操作

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="ab(c)d\\1";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abcdc";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="ab(cd)\\1";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abcdcd";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="ab(c)(d)\\1\\2";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abcdcd";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 注意与括号相关的理解操作,如何进行实现是非常必要的,主要是匹配问题

特殊系正则:

. 表示一个字符位置(可以进行多个组和表示多个字符)

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23....417";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23aatt417";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

|表示输入的字符满足后面所跟字符关系,才符合条件

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23(aa||bb||cc)";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23bb";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 注意事项:还是应该对相关字符括号进行明确,注意字符串的拼接理解

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23(aa||bb||cc)22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23bb22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

等同于或操作

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23(aaaaaaa|bbbbbbb)22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23bbbbbbb22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 运用直线操作可以代表相关的字符串类型

?表示匹配前面的子表达式0次或者一次

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="abc?de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abcde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 只能说匹配的是前面的单个子表达式(在这里就理解为除c or 包括c吧)

+匹配前面的子表达式一次或者多次(至少一次)

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="abc+de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abccccccde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 这里面是否有一种迭代的思想在里面呢?

*表示ab和de之间有任意个子表达式的匹配个数

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="abc*de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 居然可以表示0个!

括号系正则 【】{}

[]表示匹配括号中的任意字符操作

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[abc]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23c22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 只能代表字符类型的匹配操作

[^xxx]表示不与括号中的字符匹配,即除括号里面的字符去匹配其他的

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[^abc]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23e22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

[a-z]表示a-z之间所有字符都满足条件的匹配

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[a-z]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23f22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 这个表示闭区间操作

[1-9]表示1~9之间所有字符都满足匹配条件

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[1-9]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23922";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 此方法只能表示数字1~9之间的相关数字操作,千万需要对操作进行注意

  • 此方法等价于\d的操作理解,如何进行实现是非常必要的操作之一

[^xxx]表示相关的非符合操作的字符串

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[^a-z]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23!22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 这个除了相关字符的理解,是可以对特殊字符进行操作的!

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="23[^1-9]22";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="23a22";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

{n}这里的n表示非负整数,匹配确定的前面的表达式n次

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="abc{4}de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abccccde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="ab(xx|yy){4}de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abyyyyyyyyde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}

确定的子表达式是否只是一个单个的字符串的理解呢?

{n,m}表示子表达式最多匹配m次,最少匹配n次

import java.util.regex.Pattern;

public class StringMatch {
    //原来整个必须是固定格式的操作才是符合概念理解的操作的
    private static final String target="abc{2,4}de";
    /**为什么java里面和他给的语法完全不一致啊,为什么会是两个反斜杠呢?
     * */
    public static void main(String[] args) {
        //还是需要注意字符转换的操作
        String name="abcccde";
        boolean isRuslt= Pattern.matches(target,name);
        System.out.println(target);
        System.out.println(isRuslt);
    }
}
  • 依旧是闭区间啊

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值