Java正则表达式基本练习
在Java中,正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它使用一种特定格式的字符串来描述、匹配和查找文本模式。正则表达式在Java中广泛应用于各种文本处理任务,如验证用户输入、搜索和替换文本中的特定模式等。
正则表达式的作用:
- 验证:用于验证用户输入是否符合特定格式,如电子邮件地址、电话号码等。
- 搜索:在文本中查找符合特定模式的字符串。
- 替换:将文本中符合特定模式的字符串替换为其他字符串。
如何使用正则表达式:
在Java中,java.util.regex
包提供了正则表达式的支持。主要的类有 Pattern
和 Matcher
。
- 创建Pattern对象 :使用
Pattern.compile()
方法将正则表达式编译为Pattern
对象。
java
Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字
- 创建Matcher对象 :使用
Pattern
对象的matcher()
方法创建Matcher
对象,用于在目标字符串上进行匹配操作。
java
Matcher matcher = pattern.matcher("abc123def456");
- 执行匹配操作 :使用
Matcher
对象的各种方法执行匹配操作,如find()
,matches()
,replaceAll()
,replaceFirst()
等。
java
if (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
注意事项:
- 转义字符 :在正则表达式中,一些特殊字符(如
.
,*
,?
,+
,^
,$
,[
,]
,{
,}
,(
,)
,|
,\
)需要转义才能表示其字面意义。可以使用反斜杠\
进行转义。 - 性能问题:复杂的正则表达式可能导致性能问题,特别是在处理大量文本时。尽量保持正则表达式的简洁和高效。
- 可读性:复杂的正则表达式可能难以理解和维护。为了提高可读性,可以使用命名捕获组、注释等特性。
常用和对打竞赛有帮助的方法:
- 匹配方法:
matches()
:整个区域与模式匹配。find()
:查找下一个匹配项。lookingAt()
:从输入序列的起始位置开始尝试匹配模式。
- 替换方法:
replaceAll()
:替换所有匹配项。replaceFirst()
:替换第一个匹配项。
-
分组与捕获 :使用括号
()
创建捕获组,可以通过Matcher
的group()
方法获取捕获的内容。 -
边界匹配:
^
:匹配输入字符串的开始位置。$
:匹配输入字符串的结束位置。\b
:匹配一个单词边界。
- 预定义字符类:
.
:匹配任何单个字符(除了换行符)。\d
:匹配一个数字字符。\D
:匹配一个非数字字符。\s
:匹配任何空白字符。\S
:匹配任何非空白字符。\w
:匹配任何单词字符(等价于[a-zA-Z_0-9]
)。\W
:匹配任何非单词字符。
在编程竞赛中,正则表达式常用于文本解析、模式识别等任务。熟练掌握正则表达式的基本语法和常用方法,能够帮助你快速解决相关问题。
练习一:
- 细节:拿着正确的数据,从左往右依次去写
java
package com.mohuanan.zhengze;
public class Demo01 {
public static void main(String[] args) {
//正则表达式1
String regex1 = "[1][3-9]\\d{9}";
String str = "17363305031";
boolean matches1 = "13447944571".matches(regex1);
System.out.println(matches1);
//正则表达式2
System.out.println("------------");
String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
boolean matches2 = "020-0324242".matches(regex2);
System.out.println(matches2);
System.out.println("-----------");
//正则表达式3
//注意点 使用. 需要\\(两个\\表示一个\),然后再加一个. 因为.也是转义字符
//()表示分组 ([a-zA-Z]{2,3}){1,2}:表示有1个或者2个组;(a-z-A-Z有两个或者3个)
String regex3 = "\\w+@[\\w&&[^_]]{2,6}\\.([a-zA-Z]{2,3}){1,2}";
String str3 = "2736674847@qq.com";
boolean matches3 = str3.matches(regex3);
System.out.println(matches3);
String regex4 = "[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]";
boolean mathes4 = "452402555508120617".matches(regex4);
System.out.println(mathes4);
}
}
练习二:
- 细节:拿着正确的数据,从左往右依次去写
java
package com.mohuanan.zhengze;
public class Demo03 {
public static void main(String[] args) {
//要求一:18位 前面17位任意数字(但是第一个数字不能是0) 最后一个数字或者x,X
//String regex1 = "[1-9]\\d{16}[\\dxX]";
//或者
String regex1 = "[1-9]\\d{16}(\\d|(?i)x)";
String str1 = "45240220050945054X";
boolean matches1 = str1.matches(regex1);
System.out.println(matches1);
//(?i)abc: 表示忽略abc的大小写
//a(?i)ab: 表示忽略bc的大小写
//a((?i)b)c: 表示只忽略b的大小写
System.out.println("-------------");
//身份证号码的严格校验
String idRegex = "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\\d|3[0-1])\\d{3}[\\dxX]";
String str2 = "452402200512345678";
boolean matches2 = str2.matches(idRegex);
System.out.println(matches2);
}
}