什么是正则表达式?
正则表达式是一种用于匹配字符串模式的强大工具,它定义了一套特殊的语法规则,可以用来:
查找文本
验证格式
替换文本
提取信息
常用正则表达式工具:https://www.jyshare.com/front-end/854/
为什么要用正则?
简化代码:不需要写复杂的字符串处理逻辑
提高效率:一行代码就能完成复杂的字符串匹配
可维护性:模式易于修改和维护
标准化:跨语言的通用解决方案
正则解决什么问题?
电话号码验证
邮箱格式检查
密码强度验证
URL解析
日期格式验证
文本解析和提取
正则表达式常用语法
// 常用正则表达式符号
^ // 开始
$ // 结束
\d // 数字 [0-9]
\w // 字母数字下划线 [a-zA-Z0-9_]
\s // 空白字符
. // 任意字符
* // 0或多次
+ // 1或多次
? // 0或1次
{n} // 正好n次
{n,} // 至少n次
{n,m} // n到m次
[abc] // a或b或c
[^abc] // 除了a,b,c之外的字符
(...) // 分组
| // 或
Java中使用正则的方式
下面是一个综合示例,展示了正则表达式的多种用法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
// 1. 基本匹配示例
basicMatching();
// 2. 提取信息示例
extractInformation();
// 3. 替换文本示例
replaceText();
// 4. 实际应用示例:解析日志
parseLog();
}
/**
* 基本匹配示例
*/
private static void basicMatching() {
// 验证手机号
String phoneRegex = "^1[3-9]\\d{9}$";
String phone1 = "13812345678";
String phone2 = "1381234567"; // 错误格式
System.out.println("手机号验证:");
System.out.println(phone1 + " is valid: " + Pattern.matches(phoneRegex, phone1)); // true
System.out.println(phone2 + " is valid: " + Pattern.matches(phoneRegex, phone2)); // false
// 验证邮箱
String emailRegex = "^[A-Za-z0-9+_.-]+@(.+)$";
String email1 = "test@example.com";
String email2 = "invalid.email@";
System.out.println("\n邮箱验证:");
System.out.println(email1 + " is valid: " + Pattern.matches(emailRegex, email1)); // true
System.out.println(email2 + " is valid: " + Pattern.matches(emailRegex, email2)); // false
}
/**
* 提取信息示例
*/
private static void extractInformation() {
String text = "My phone number is 13812345678 and my email is test@example.com";
// 提取手机号
Pattern phonePattern = Pattern.compile("1[3-9]\\d{9}");
Matcher phoneMatcher = phonePattern.matcher(text);
System.out.println("\n提取手机号:");
while (phoneMatcher.find()) {
System.out.println("Found phone: " + phoneMatcher.group());
}
// 提取邮箱
Pattern emailPattern = Pattern.compile("[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+");
Matcher emailMatcher = emailPattern.matcher(text);
System.out.println("\n提取邮箱:");
while (emailMatcher.find()) {
System.out.println("Found email: " + emailMatcher.group());
}
}
/**
* 替换文本示例
*/
private static void replaceText() {
String text = "My phone is 13812345678, please contact me.";
// 将手机号中间4位替换为****
String maskedText = text.replaceAll("(1[3-9]\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println("\n替换文本:");
System.out.println("Original: " + text);
System.out.println("Masked: " + maskedText);
}
/**
* 实际应用示例:解析日志
*/
private static void parseLog() {
String logLine = "2024-01-20 10:15:30 [INFO] User(id=123) logged in from 192.168.1.1";
// 解析日志的正则表达式
String logRegex = "^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(\\w+)\\] User\\(id=(\\d+)\\) (.+)$";
Pattern pattern = Pattern.compile(logRegex);
Matcher matcher = pattern.matcher(logLine);
System.out.println("\n解析日志:");
if (matcher.find()) {
System.out.println("Timestamp: " + matcher.group(1));
System.out.println("Log Level: " + matcher.group(2));
System.out.println("User ID: " + matcher.group(3));
System.out.println("Message: " + matcher.group(4));
}
}
}```
运行结果示例
手机号验证:
13812345678 is valid: true
1381234567 is valid: false
邮箱验证:
test@example.com is valid: true
invalid.email@ is valid: false
提取手机号:
Found phone: 13812345678
提取邮箱:
Found email: test@example.com
替换文本:
Original: My phone is 13812345678, please contact me.
Masked: My phone is 1381****5678, please contact me.
解析日志:
Timestamp: 2024-01-20 10:15:30
Log Level: INFO
User ID: 123
Message: logged in from 192.168.1.1