正则表达式就是一个验证字符串格式是否满足要求的字符串。 使用一个字符串匹配一组字符串,这个字符串就是正则表达式(模式)
(1)字符类:
元符集 | 解释 |
a | 字符a |
[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](减去) |
(2)预定义字符类:
预定义字符类 | 解释 |
. | 任意字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\w | 单词字符[a-zA-Z_0-9] |
^ | 行开头 |
$ | 行结尾 |
X? | 一次或0次 |
X* | 0次或多次(包括1次) |
X+ | 一次或多次 |
X{n} | 恰好n次 |
X{n,} | 至少n次 |
X{n,m} | 至少n次,不超过m次 |
(3)匹配电话号码:
//匹配电话号码
String phone = "18637866964";
String reg = "^1[3,5,7,8,9]\\d{9}$";
System.out.println(phone.matches(reg));
原理:
String 中的matches()方法,用来进行正则表达式的验证,匹配返回 true,否则返回 false。
String中的源码:
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
在String 的matches()方法中使用了 Pattern 的静态方法 matches()方法进行正则表达式的验证。Pattern的matches()方法的源码:
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
从源码中可以看出:正则表达式的一般使用步骤:
如果正则表达式只使用一次,也可以写成如下形式:
boolean b = Matcher.matches(reg,input);
(4)正则表达式的其他应用:
正则表达式除了可以进行字符串的匹配验证,还可以进行拆分字符串、获取字符串的子串、字符串替换:
1)拆分字符串:
String test_1 = "my name is suxing";
//根据空格拆分字符串,“ +”:匹配一个或多个空格。
String [] words = test_1.split(" +");
for(String s:words){
System.out.println(s);
}
//根据空格或逗号拆分字符串,“[ ,]”:匹配一个空格或一个逗号
String test_2 = "my name is zhangsan,wlecome to beijing";
String [] words_1 = test_2.split("[ ,]");
for(String s:words_1){
System.out.println(s);
}
2)获取子串:
//获取字符串中的java、Java、JAVA
String test_1 = "java 是世界上最好的语言,Java天下第一,我爱JAVA";
String reg = "[jJ]ava|JAVA";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(test_1);
while (matcher.find()){
System.out.println(matcher.group());
}
使用 Matcher 对象的find() 方法查询是否存在满足正则表达式的字符串,如果有,使用group() 方法输出。
3)替换:
//把字符串中的java、Java、JAVA全部替换成PHP
String test_1 = "java 是世界上最好的语言,Java天下第一,我爱JAVA";
String reg = "[jJ]ava|JAVA";
String test_2 = test_1.replaceAll(reg,"PHP");
System.out.println(test_2);
4)统计字符串出现的次数:
package com.qianfeng.kaoti01;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test02 {
public static void main(String[] args) {
int num = 0;
String str= "I wish you become better and better";
String reg = "[e]";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
num++;
}
System.out.println("共"+num+"个e");
}
}
(5)练习题:
1、利用正则表达式,把 “我...我我...喜欢欢欢...编编程程程...” ,转换成 “我喜欢编程” ;
String test_1 = "我...我我...喜欢欢欢...编编程程程...";
String test_2 = test_1.replace(".","");
String test_3 = test_2.replaceAll("(.)\\1+","$1");
System.out.println(test_3);
"\\1"表示引用前面的一组表达式即 "(.)”,"$1" 表示 "\\1" ;
2、利用正则表达式,把 “我..喜欢喜欢...编程编程编程...” ,转换成 “我喜欢编程” ;
String test_1 = "我..喜欢喜欢...编程编程编程...";
String test_2 = test_1.replace(".","");
String test_3 = test_2.replaceAll("(.)(.)(\\1\\2)+","$1$2");
System.out.println(test_3);