🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
正则表达式(Regular Expression,简称Regex或RegExp)是一个用来描述、匹配、搜索某个文本或字符串的规则或模式。它通常由一些特定的字符和操作符组成,可以用来匹配和过滤各种文本信息。正则表达式可以用于实现文本的查找、替换、过滤、验证等操作,是编程和数据处理领域中非常有用的工具。
在Java中,可以使用正则表达式来匹配QQ号码。QQ号码的规则是:不以0开头的数字串。
以下是匹配QQ号码的示例代码:
public static void main(String[] args) {
System.out.println(checkQQ("2324224c"));
System.out.println(checkQQ("2324224"));
System.out.println(checkQQ2("2324224c"));
System.out.println(checkQQ2("2324224"));
}
public static boolean checkQQ2(String qq){
return qq != null && !qq.startsWith("0") && qq.matches("\\d{6,20}");
}
public static boolean checkQQ(String qq){
// 1、判断qq是否为null,以及是否不满足6位以上。 不能以0开始。
if(qq == null || qq.length() < 6 || qq.length() > 20 || qq.startsWith("0")) {
return false;
}
// 2、必须全部是数字 遍历qq号码中的每个字符 323a242442
for (int i = 0; i < qq.length(); i++) {
char ch = qq.charAt(i);
// 3、判断这个字符是否是非数字
if(ch < '0' || ch > '9') {
return false;
}
}
// 4、返回正确
return true;
}匹配规则简单案例:
public static void main(String[] args) {
//public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
// 只能是 a b c
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false
// 不能出现a b c
System.out.println("a".matches("[^abc]")); // false
System.out.println("z".matches("[^abc]")); // true
System.out.println("a".matches("\\d")); // false
System.out.println("3".matches("\\d")); // true
System.out.println("333".matches("\\d")); // false 每次只能匹配一个字符!
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("242dxf_33".matches("\\w{6,}"));
System.out.println("243".matches("\\w{6,}"));
// 验证码 必须是数字和字符 必须是4位
System.out.println("23dA".matches("[\\w&&[^_]]{4}"));
System.out.println("2_dA".matches("[\\w&&[^_]]{4}"));
System.out.println("24dA".matches("[a-zA-Z0-9]{4}"));
System.out.println("2_dA".matches("[a-zA-Z0-9]{4}"));
}由此案例可汇总以下匹配规则
匹配 | 规则 |
|---|---|
[abc] | 只能是a, b, 或c |
[^abc] | 除了a, b, c之外的任何字符 |
[a-zA-Z] | a到z A到Z,包括(范围) |
[a-d[m-p]] | a到d,或m通过p:([a-dm-p]联合) |
[a-z&&[def]] | d, e, 或f(交集) |
[a-z&&[^bc]] | a到z,除了b和c:([ad-z]减法) |
[a-z&&[^m-p]] | a到z,除了m到p:([a-lq-z]减法) |
匹配 | 规则 |
|---|---|
. | 任何字符 |
\d | 一个数字: [0-9] |
\D | 非数字: [^0-9] |
\s | 一个空白字符: [ \t\n\x0B\f\r] |
\S | 非空白字符: [^\s] |
\w | [a-zA-Z_0-9] 英文、数字、下划线 |
\W | [^\w] 一个非单词字符 |
匹配 | 规则 |
|---|---|
X? | X , 一次或根本不 |
X* | X,零次或多次 |
X+ | X , 一次或多次 |
X {n} | X,正好n次 |
X {n, } | X,至少n次 |
X {n,m} | X,至少n但不超过m次 |
Java中的正则表达式支持分组匹配、反向引用匹配、零宽度断言匹配和注释匹配。下面分别介绍和示例:
分组匹配使用圆括号 () 将一组正则表达式进行分组,方便进行重复匹配或逻辑操作。分组匹配可以使用在量词、跟随限定符和替换等场景。
示例:
String regex = "(\\d{3})-(\\d{4})-(\\d{4})";
String str = "电话号码:010-1234-5678";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String phoneNumber = matcher.group();
String areaCode = matcher.group(1);
String prefix = matcher.group(2);
String lineNum = matcher.group(3);
System.out.println("电话号码:" + phoneNumber + ", 区号:" + areaCode + ", 前缀:" + prefix + ", 号码:" + lineNum);
}输出:
电话号码:010-1234-5678, 区号:010, 前缀:1234, 号码:5678反向引用匹配使用反斜杠 \ 将已匹配的字符引用到后面的正则表达式中。反向引用可以用于查找连续出现的相同的字符等情况。
示例:
String regex = "(.)\\1+";
String str = "aaabccccddeee";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("重复字符:" + matcher.group());
}输出:
重复字符:aaa
重复字符:ccc
重复字符:eee零宽度断言匹配使用特殊字符对匹配的位置进行限制,但不会将断言的字符包含在匹配的结果中。零宽度断言分为正向先行断言、负向先行断言、正向后行断言和负向后行断言四种类型。
示例:
String regex = "(?<=\\$)\\d+(?=\\$)";
String str = "原价:$1000,折扣价:$800";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("折扣价:" + matcher.group());
}输出:
折扣价:800注释匹配使用 (?#comment) 进行注释,提高正则表达式的可读性。
示例:
String regex = "\\d{3}-\\d{4}-(?#ignore)\\d{4}"; // 忽略最后四位
String str = "电话号码:010-1234-5678";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("电话号码:" + matcher.group());
}输出:
电话号码:010-1234/**
目标:正则表达式在方法中的应用。
String类的方法:
public String[] split(String regex):
-- 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。
public String replaceAll(String regex,String newStr)
-- 按照正则表达式匹配的内容进行替换
*/
public class RegexDemo {
public static void main(String[] args) {
String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";
String[] nameArr = names.split("\\w+");
for (int i = 0; i < nameArr.length; i++) {
System.out.println(nameArr[i]);
}
String result = names.replaceAll("\\w+", "lv");
System.out.println(result);
}
}/**
拓展:正则表达式爬取信息中的内容。(了解)
*/
public class RegexDemo {
public static void main(String[] args) {
String rs = "学习Java,电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
// 需求:从上面的内容中爬取出 电话号码和邮箱。
// 1、设计爬取规则对象
Pattern p = Pattern.compile("(0\\d{2,7}-?\\d{5,20})|(\\w{2,30}@\\w{2,20}(\\.\\w{2,10}){1,2})|(1[3-9]\\d{9})");
// 2、得到一个匹配器对象:集合爬取规则,内容。
Matcher m = p.matcher(rs);
// 3、开始爬取内容输出
while (m.find()) {
System.out.println(m.group());
}
}
}/**
目标:使用正则表达式解决一些问题
*/
public class RegexTest {
public static void main(String[] args) {
// checkPhone();
// checkEmail();
checkTel();
}
public static void checkTel() {
// 1、电话
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("输入号码:");
String email = sc.next();
// 2、使用正则表达式校验
// 020-2324242 02122442 027-42424 0712-3242434
if(email.matches("0\\d{2,7}-?\\d{5,20}")){
System.out.println("号码没有毛病~~");
break;
}else {
System.out.println("你输入的号码有问题~");
}
}
}
public static void checkEmail() {
// 2、邮箱
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("输入邮箱号码:");
String email = sc.next();
// 2、使用正则表达式校验
// 3232323@qq.com xulei@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
if(email.matches("\\w{2,30}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
System.out.println("邮箱号码没有毛病~~");
break;
}else {
System.out.println("你输入的号码有问题~");
}
}
}
public static void checkPhone(){
// 3、手机号码
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("输入手机号码:");
String phone = sc.next();
// 2、使用正则表达式校验手机号码的格式
// 18667676520
if(phone.matches("1[3-9]\\d{9}")){
System.out.println("手机号码没有毛病~~");
break;
}else {
System.out.println("你输入的手机号码有问题~");
}
}
}
}亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。