一、定义
正则表达式(regular expression)是一个字符串,用来描述匹配一个字符串集合的模式。可以使用正则表达式匹配、替换和拆分字符串。 Linux 工具可以用它来过滤文本。 Linux工具(比如 sed 编辑器或 gawk 程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。
二、 匹配字符串
string类中的matches方法不仅可以匹配固定字符串,还可以匹配符合一个模式的字符串集。例如,以下语句结果都为true。
String s = new String(“java is fun”);
System.out.println(s.matches("java.*");
前面“Java.*”是一个正则表达式。描述了一个字符串模式,以Java开始,后面跟着0个或多个字符串。
三、正则表达式语法
正则表达式由字面值字符和特殊符号组成,下表是常用的语法。
(注意:反斜杠字符是特殊字符,在字符串中开始转义序列。故表格中 ” \\ " 是表示 “ \ " )
1.示例1
社会安全号模式xxx-xx-xxxx,其中x是数字,根据上表可以描述为[\\d]{3}-[\\d]{2}-[\\d]{4}。
public static void main(String[] args){
String s = new String("111-22-3333");
String regex = "[\\d]{3}-[\\d]{2}-[\\d]{4}";
System.out.println(s.matches(regex));
}
2.示例2
偶数以数字0、2、4、6或8结尾。偶数的模式可以描述为[\\d]*[02468]
public static void main(String[] args){
String s = new String("122");
String regex = "[\\d]*[02468]";
System.out.println(s.matches(regex));
}
3.示例3
电话号码模式是(xxx)xxx-xxxx,x为一位数字,并且第一位数字不能为零。电话号码的正则表达式可以描述为
\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}
public static void main(String[] args){
String s = new String("(912)921-2728");
String regex = "\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}";
System.out.println(s.matches(regex));
}
四、懒惰匹配和贪婪匹配
贪婪匹配:正则表达式中包含重复的限定符时,通常的行为是匹配尽可能多的字符。
懒惰匹配:在特殊情况下需要匹配尽可能少的字符。
例如: a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。但是我们此时可能需要匹配的是ab这样的话就需要用到懒惰匹配了。懒惰匹配会匹配尽可能少的字符
常用的懒惰匹配限定符如下:
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
五、替换和拆分字符串
1.替换字符
String类包含replaceAll、replaceFirst和·split方法,用于替换和拆分字符串。
replaceAll方法替换所有匹配的子字符串。
例如:
System.out.println("Java Java Java".replaceAll("v\\w","wi"));
//显示Jawi Jawi Jawi
replaceFirst方法替换第一个匹配的子字符串
System.out.println("Java Java Java".replaceFirst("v\\w","wi"));
//显示Jawi Java Java
2.拆分字符
Srting类有split方法,分别按照参数字符串分割,存储在ss[]中,用于分割的字符串舍弃
代码示例:(此处演示 如何按照 - 或者 ~ 或者 数字 来分割字符串)
String str = new String("jike~hello-world234java");
String[] split = str.split("-|~|\\d+");
for(String s : split) {
System.out.println(s);
}
运行结果
jike
hello
world
java
若有不足,欢迎指正!