一种校验字符串的规则
作用:
校验字符串是否满足规则
在一段文本中查找满足要求的内容
常见的正则表达式符号
// [a-d[m-p]] a到d,或m到p
System.out.println("-----------4-------------");
System.out.println("a".matches("[a-d[m-p]]"));//true
System.out.println("d".matches("[a-d[m-p]]")); //true
System.out.println("m".matches("[a-d[m-p]]")); //true
System.out.println("p".matches("[a-d[m-p]]")); //true
System.out.println("e".matches("[a-d[m-p]]")); //false
System.out.println("0".matches("[a-d[m-p]]")); //false
// [a-z&&[def]] a-z和def的交集。为:d,e,f
System.out.println("----------5------------");
System.out.println("a".matches("[a-z&[def]]")); //false
System.out.println("d".matches("[a-z&&[def]]")); //true
System.out.println("0".matches("[a-z&&[def]]")); //false
// [a-z&&[^bc]] a-z和非bc的交集。(等同于[ad-z])
System.out.println("-----------6------------_");
System.out.println("a".matches("[a-z&&[^bc]]"));//true
System.out.println("b".matches("[a-z&&[^bc]]")); //false
System.out.println("0".matches("[a-z&&[^bc]]")); //false
// [a-z&&[^m-p]] a到z和除了m到p的交集。(等同于[a-1q-z])
System.out.println("-----------7-------------");
System.out.println("a".matches("[a-z&&[^m-p]]")); //true
System.out.println("m".matches("[a-z&&[^m-p]]")); //false
System.out.println("0".matches("[a-z&&[^m-p]]")); //false
//.表示任意一个字符
System.out.println("你".matches("..")); //false
System.out.println("你".matches(".")); //true
System.out.println("你a".matches(".."));//true
// \\d 表示任意的一个数字
// \\d只能是任意的一位数字
// 简单来记:两个\表示一个\
System.out.println("a".matches("\\d")); // false
System.out.println("3".matches("\\d")); // true
System.out.println("333".matches("\\d")); // false
//\\w只能是一位单词字符[a-zA-Z_0-9]
System.out.println("z".matches("\\w")); // true
System.out.println("2".matches("\\w")); // true
System.out.println("21".matches("\\w")); // false
System.out.println("你".matches("\\w"));//false
// 非单词字符
System.out.println("你".matches("\\W")); // true
System.out.println("---------------------------------------------");
// 以上正则匹配只能校验单个字符。
// 必须是数字 字母 下划线 至少 6位
System.out.println("2442fsfsf".matches("\\w{6,}"));//true
System.out.println("244f".matches("\\w{6,}"));//false
// 必须是数字和字符 必须是4位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
练习
验证手机号
分成三部分:
- 1 表示手机号码只能以1开头
- [3-9] 表示第二位数字必须是3-9之间的
- \d{9} 表示任意数字可以出现9次, 也只能出现9次
package RegexDemo;
public class RegexDemo2 {
public static void main(String[] args) {
// 验证手机号码
String regex1 = "1[3-9]\\d{9}";
System.out.println("13112345678".matches(regex1));
System.out.println("131123_5678".matches(regex1));
System.out.println("1311a345678".matches(regex1));
System.out.println("131152345678".matches(regex1));
System.out.println("03112345678".matches(regex1));
}
}
验证邮箱
String regex3 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
System.out.println("474328774@qq.com".matches(regex3));
验证身份证
package RegexDemo;
public class RegexDemo3 {
public static void main(String[] args) {
// 请编写正则表达式验证用户名是否满足要求。
// 要求:大小写字母,数字,下划线一共4-16位
String regex1 = "\\w{4,16}";
// 请编写正则表达式验证身份证号码是否满足要求。
// 简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的X
// 复杂要求:按照身份证号码的格式严格要求
String regex2 = "[1-9]\\d{16}(0-9|X|x)";
String regex3 = "[1-9]\\d{16}[\\dXx]";
String regex7 = "[1-9]\\d{16}(\\d|(?i)x";
// regex2 和regex3 和 regex7等价
System.out.println("76104310000564371x".matches(regex2));
// 忽略大小写的书写方式
// 在匹配的时候忽略abc的大小写
String regex4 = "(?i)abc";
// 之忽略bc的大小写
String regex5 = "a(?i)bc";
// 只忽略b的大小写
String regex6 = "a((?i)b)c";
System.out.println("abc".matches(regex6));
System.out.println("aBc".matches(regex6));
// 复杂
String IDCardRegex = "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|10|11|12)(0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]";
}
}
爬虫
Pattern: 表示正则表达式
Matcher: 文本匹配器, 作用: 按照正则表达式的规则去读取字串, 从头开始读取
package RegexDemo1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
// 要求找出里面所有的JAVAXX
String str = "Java自从95年问世以来, 经历了很多版本, 目前企业中用的最多的是Java8" +
"和Java11, 因为这两个是长期支持版本, 下一个长期支持版本是Java17, 相信在未来不久Java17也会登上历史舞台";
// 获取正则表达式的对象
Pattern p = Pattern.compile("Java\\d{0,2}");
// 获取文本匹配器的对象
// m: 文本匹配器的对象
// str: 大串
// p: 规则
// 理解为: m要在str中找符合p规则的小串
Matcher m = p.matcher(str);
// 拿着文本匹配器从头开始读取, 寻找是否有满足规则的子串
// 如果没有, 方法返回false
// 如果有, 返回true, 在底层记录字串的起始索引和结束索引+1
// 0, 4
boolean b = m.find();
System.out.println(b); // true
// 方法底层会根据find方法记录的索引进行字符串的截取
// subString(start, end) 包头不包围
// (0, 4) 但是不包括4索引
// 会把街区的小串进行返回
String s1 = m.group();
System.out.println(s1);
// 第二次调用find的时候, 会继续读取后面的内容
// 重复返回
while(m.find()){
s1 = m.group();
System.out.println(s1);
}
}
}