一、什么是正则表达式
正则表达式(Regular Expression),简称为Regex或RegExp,是一种用于匹配、查找和替换文本的强大工具。它是由一系列字符和特殊字符组成的模式,用于描述字符串的特定格式或模式。在生活中我们经常会进行一些操作,如判断字符串是否是有效的电话号码,邮箱地址是否正确,字符串是否符合格式要求。
如以下代码:
//判断号码的格式是否正确
public boolean isValidMobileNumber(String str){
if (str.length() !=11 ){
return false;
}
for (int i=0; i<str.length();i++ ){
char a = str.charAt(i);
if (a<'0' || a>'9'){
return false;
}
}
return true;
}
//示例 判断用户输入的是否是20xx年
//规则 2 0 \d \d
//java字符串 “20\\d\\d”
//java代码 : boolean is20xx = input.matches(“20\\d\\d”)
public boolean isyear(String y){
if (y == null){
return false;
}
return y.matches("20\\d\\d");
}
使用正则表达式有哪些好处:
-
强大的模式匹配:正则表达式提供了一种强大的方式来描述和匹配字符串的模式。它可以识别复杂的模式,例如特定的字符序列、数字模式、日期格式等,从而有助于对字符串进行有效的匹配和处理。
-
灵活的搜索和替换:正则表达式可以在文本中快速搜索和定位特定模式的内容。这使得在文本编辑器、编程语言中进行批量替换、搜索功能等操作变得更加灵活和高效。
-
数据验证和过滤:正则表达式可以用于验证用户输入的数据是否符合特定的模式或条件。例如,检查电子邮件地址、电话号码、密码强度等,可以通过正则表达式进行高效的验证。它还可以用于过滤和清理数据,从而确保数据的一致性和正确性。
-
代码简化和效率提升:正则表达式提供了一种紧凑的语法和功能,可以在很少的代码量下完成复杂的匹配和操作。这样可以提高代码的可读性、可维护性,并且减少编写大量逻辑代码的需求,从而提升开发效率。
-
平台和多语言支持:正则表达式几乎在所有主流编程语言中得到了广泛支持,因此可以在不同的平台和语言环境中共享和重用正则表达式的逻辑和代码。
总体而言,正则表达式是一种强大的工具,可以在文本处理、数据验证和过滤、模式匹配等场景中提高效率和灵活性。然而,需要注意的是正则表达式本身的学习曲线较陡峭,编写复杂的正则表达式可能需要一些技巧和经验。
二、正则表达式的一些匹配规则
1一些基本的匹配规则
正则表达式 | 规则 | 可以匹配 |
---|---|---|
A | 指定字符 | A |
\u548c | 指定Unicode字符 | 和 |
. | 任意字符 | a,b,&,0 |
\d | 0~9 | 0,1,2,…9 |
\w | 空格、Tab键 | " " |
\D | 非数字 | a,A,&,-, |
\W | 非\w | &,@,中, |
\S | 非\s | a,A,&,-, |
AB* | 任意个数字符 | A,AB,ABB,ABBB |
AB+ | 至少1个字符 | AB,ABB,ABBB |
AB? | 0个或1个字符 | A,AB |
AB{3} | 指定个数字符 | ABBB |
AB{1,3} | 指定范围个数字符 | AB,ABB,ABBB |
AB{2,} | 至少n个字符 | ABB,ABBB,… |
AB{0,3} | 最多n个字符 | A,AB,ABB,ABBB |
2复杂一些的匹配规则
正则表达式 | 规则 | 可以匹配 |
---|---|---|
^ | 开头 | 字符串开头 |
$ | 结尾 | 字符串结束 |
[ABC] | […]内任意字符 | A,B,C |
[A-F0-9xy] | 指定范围的字符 | A,…,F,O,…,9,x,y |
[^A-F] | 指定范围外的任意字符 | 非A,…,F |
AB|CD | AB或CD | AB,CD |
AB|CD|EFG | AB或CD或EFG | AB,CD,EFG |
三 分组匹配规则
括号可以用来进行分组匹配 (…): “(\d{4})\-(d{1,2})\-(d{1,2})”
“2016-12-12” --> “2016” “12” “12”
举例 :提取电话号码 ###-########
正则表达式:^ (\d{3,4} \ - \ d{6,8} ) $
代码:String regex = “^\\ d{3,4} \\ - \\ d{6,8}$”
//1 分组匹配规则
//反复使用一个正则表达式字符串进行快速匹配效率比较第可以吧正则表达式字符串编译为Pattern对象
Pattern pattern = Pattern.compile("^\\d{3,4}\\-\\d{6,8}$");
pattern.matcher("010-12345678").matches(); //true
Matcher matcher = pattern.matcher("010-12345678");
//0 表示匹配整个字符串,n表示第n个子串
matcher.group(0);
四 非贪婪匹配
非贪婪匹配(也称为惰性匹配或最小匹配)是正则表达式中一种匹配模式的方式。默认情况下,正则表达式是贪婪匹配的,即尽可能多地匹配字符。而非贪婪匹配则相反,它尽可能少地匹配字符。非贪婪匹配通常使用 ? 修饰符来实现。在正则表达式中,当使用 *、+、? 或 {} 等限定符时,它们将默认为贪婪匹配,即匹配尽可能多的字符。但是,当在贪婪的限定符后面添加 ? 时,它们变为非贪婪匹配,即匹配尽可能少的字符。
示例:
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
// 待搜索的字符串
String text = "abcabcabc";
// 使用非贪婪匹配的正则表达式进行搜索
String pattern = "a.*?b";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
if (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
}
}
//输出
Match: ab
五 搜索与替换
在正则表达式中,搜索和替换是常见的操作之一,用于在文本中查找匹配某个模式的字符串,并且可以将这些匹配的字符串替换为指定的内容。
示例代码:
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
// 待搜索和替换的字符串
String text = "Hello, world! Welcome to the world of programming!";
// 使用正则表达式进行搜索
String pattern = "world";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
while (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
// 使用正则表达式进行替换
String replacement = "code";
String newText = text.replaceAll(pattern, replacement);
System.out.println("New Text: " + newText);
}
}
总结
1 正则表达式是一个字符串
2 正则表达式用字符串描述一个匹配规则
3 使用正则表达式可以快速判断给定的字符串是否符合匹配规则
4 Java内建正则表达式引擎 java.util.regex