正则的应用场景:
密码格式校验、密码匹配校验
字符串匹配
字符串替换
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);
}
}
依旧是闭区间啊