作用一:检验字符串是否满足规则
作用二:在一段文本中查找满足要求的内容
字符类和预定义字符(只能匹配一个字符)
public class Test{
public static void main(String[] args){
System.out.println("a".matches("[abc]")); //判断a是否在abc范围内
System.out.println("a".matches("[^abc]")); //判断a是否在除了abc以外的范围内
//正则表达式是一个字符一个字符判断的
System.out.println("zz".matches("[^abc]")); //false
System.out.println("zz".matches("[^abc][^abc]")); //true
//a-z或A-Z(包含头尾的范围)
System.out.println("a".matches("a-zA-z")); //判断a是否在a-z或A-Z的范围内
System.out.println("aa".matches("[a-zA-Z][a-zA-z]")); //true
System.out.println("0".matches("[a-zA-Z0-9]")); //true
System.out.println("a".matches([a-d[m-p]])); //判断a是否在a-d或m-p范围中
&&(取交集)
System.out.println("d".matches("[a-z&&[def]]"));//a-z和def取交集,实际上就是def范围内
// \是转义字符,改变后面那个字符原本的含义
System.out.println("\""); //此时\表示转义字符,改变了后面那个双引号原本的含义,使它变成
//了一个普普通通的双引号而已
System.out.println("d".matches(".")); //这里的. 表示任意字符,但是只能表示一个字符
System.out.println("3".matches("\\d")); //因为Java中\是转义字符,所以\d会将d失去意
//义,所以我们使用\\d,使第二个\失去意义,也就
//是\\d,其实就相当于\d
System.out.println("_".matches("\\w")); // \\w表示[a-zA-Z_0-9]
System.out.println("你".matches("\\W")); //注意此处的\\W表示除了以上的其他范围
}
}
我们可以将电话号码的要求写在一个字符串中
严格的身份证号码校验:
总结:
replaceAll:
split:
分组:
package com.itheima.a08regexdemo;
public class RegexDemo12 {
public static void main(String[] args) {
//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
//举例: a123a b456b 17891 &abc& a123b(false)
// \\组号:表示把第X组的内容再出来用一次
String regex1 = "(.).+\\1";
System.out.println("a123a".matches(regex1));
System.out.println("b456b".matches(regex1));
System.out.println("17891".matches(regex1));
System.out.println("&abc&".matches(regex1));
System.out.println("a123b".matches(regex1));
System.out.println("--------------------------");
//需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
//举例: abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2));
System.out.println("b456b".matches(regex2));
System.out.println("123789123".matches(regex2));
System.out.println("&!@abc&!@".matches(regex2));
System.out.println("abc123abd".matches(regex2));
System.out.println("---------------------");
//需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
//举例: aaa123aaa bbb456bbb 111789111 &&abc&&
//(.):把首字母看做一组
// \\2:把首字母拿出来再次使用
// *:作用于\\2,表示后面重复的内容出现日次或多次
String regex3 = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex3));
System.out.println("bbb456bbb".matches(regex3));
System.out.println("111789111".matches(regex3));
System.out.println("&&abc&&".matches(regex3));
System.out.println("aaa123aab".matches(regex3));
}
}
package com.itheima.a08regexdemo;
public class RegexDemo13 {
public static void main(String[] args) {
/*需求:
将字符串:我要学学编编编编程程程程程程替换为:我要学编程
*/
String str = "我要学学编编编编程程程程程程";
//需求:把重复的内容 替换为 单个的
//学学 学
//编编编编 编
//程程程程程程 程
// (.)表示把重复内容的第一个字符看做一组
// \\1表示第一字符再次出现
// + 至少一次
// $1 表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
}
非捕获分组:
package com.itheima.a08regexdemo;
public class RegexDemo14 {
public static void main(String[] args) {
/*
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来。
身份证号码:
41080119930228457x51080119760902230915040119810705387X130133197204039024430102197606046442
*/
//身份证号码的简易正则表达式
//非捕获分组:仅仅是把数据括起来//特点:不占用组号
//这里\\1报错原因:(?:)就是非捕获分组,此时是不占用组号的。
//(?:) (?=) (?!)都是非捕获分组//更多的使用第一个
//String regex1 ="[1-9]\\d{16}(?:\\d|x|x)\\1";
String regex2 ="[1-9]\\d{16}(\\d Xx)\\1";
//^([01]\d|2[0-3]):[0-5]\d:[@-5]\d$
System.out.println("41080119930228457x".matches(regex2));
}
}