正则表达式
正则表达式用于模糊匹配
基本用法
限定符
限定符: ? 代表前面的字符需要出现0个或1个
d? //代表前面的d需要出现0个或1个
限定符: * 代表前面的字符只能出现0个或多个
ab*c //代表b只能出现0个或多个
限定符:+ 匹配前面的字符出现一次以上
ab+c //匹配出现一次以上的字符
限定符: {…} 指定花括号前的字符出现的次数
ab{2,6}c //指定花括号前的字符出现的次数(2-6次)
在匹配多个字符出现的次数时 使用 ()
(ab){2,6}c //指定ab字符出现的次数(2-6次)
运算符
“或”运算符: |
(cat|cog) //cat 或 dog
字符类
字符类: [ ] 代表只选取方括号[]内匹配的字符
[abc]+ //代表只选取方括号[]内匹配的字符
连字符: – 用来限定范围
[a-b] //限定范围为a-b
[A-B] //限定范围为A-B
[0-9] //限定范围为0-9
尖号 ^ 字符 代表^后面列出的以外的字符
^[a-z] //代表除小写a-z以外的字符
元字符
例如: \d \w \s \D \W \S …
数字字符: \d (相当于前面的[0-9])
非数字字符: \D (相当于前面的^[0-9])
单词字符:\w (指所有英文字符、数字和下划线 _)
非单词字符:\W (指所有非英文字符、数字和下划线 _)
空白符: \s (包含Tab(制表符)和换行符)
非空白符: \S (除了Tab(制表符)和换行符)
特殊字符:. 代表任意字符,但不包含换行符
特殊字符
特殊字符: ^ 用于匹配行首
特殊字符: $ 用于匹配行尾
贪婪匹配和懒惰匹配
会匹配整串字符串 因为是贪婪匹配
<.+>
只匹配两个标签代码, +?设置为懒惰匹配
<.+?">
捕获组 ()
()
使用圆括号来创建一个捕获组,可以将匹配的内容作为一个整体处理。
捕获组可以通过反向引用 \1, \2 等来引用,其中数字表示第几个捕获组。
// 正则表达式会对捕获组进行自动的编号
// 编号是从1开始的
// 编号是从 ( 出现的位置开始计算
// (A((BC)D(E))F)(G)(W)
// \\1 A((BC)D(E))F
// \\2 (BC)D(E)
// \\3 BC
// \\4 E
// \\5 G
// \\6 W
非捕获组
(?:...)
不会保存匹配的内容,仅用于分组。
代码案例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static void method() {
String str = "9";
// 匹配字符串
// 第一个字符 a b c d
// 第二个字符 6 7 8 9
// 第三个字符 q w e
Pattern pattern = Pattern.compile("[abcd][6789][qwe]");
Matcher matcher = Pattern.matcher(str);
System.out.println(matcher.matches());
System.out.println(str.matcher("[a-d][6-9][qwe]"));
//判断由一个小写字母组成的字符串
System.out.println(str.matches("[a-z]"));
//判断由一个字母组成的字符串
//只要是连续的范围 就可以使用“-” a-z
System.out.println("[a-zA-z]");
//匹配由一个数字组成的字符串
System.out.println("[0-9]");
//判断由一个字符组成的字符串
System.out.println(str.matches("[^abc]"));
//匹配由3个字符组成的字符串
//开头是数字,结尾是字母
// .通配符 表示任意一个字符
System.out.println("\\d.[a-zA-Z]]");
//匹配 .
// boolean matches = str.matches("[.]");
boolean matches = str.matches("\\.");
System.out.println(matches);
String str = "98";
// 匹配由10个数字组成的字符串
// {n}: 表示这个字符出现恰好是n次 == n
System.out.println(str.matches("\\d{10}"));
// 匹配由至少10个数字组成的字符串
// {n,} 表示这个字符至少出现n次 >= n
System.out.println(str.matches("\\d{10,}"));
// 匹配由5-10个数字组成的字符串
// {n,m} 表示这个字符至少出现n次,最多出现m次 n <= x <= m
System.out.println(str.matches("\\d{5,10}"));
// 判断一个字符串是否出现了4个及以上的连续数字
System.out.println(str.matches(".*\\d{4}.*"));
// 判断字符串种是否出现了2个及以上的数字
System.out.println(str.matches(".*\\d.*\\d.*"));
}
练习
// 定义一个方法,输入一个字符串作为密码,要求6-12位,并且由大写字母/小写字母/数字/空格组成,并且至少出现2种
public static boolean checkPassword(String password) {
if (!password.matches("[a-zA-Z\\d ]{6,12}")) {
return false;
}
// 定义变量,记录字母类型种类的次数
int count = 0;
// 判断是否出现了大写字母
if (password.matches(".*[A-Z].*")) {
count++;
}
// 判断是否出现了小写字母
if (password.matches(".*[a-z].*")) {
count++;
}
// 判断是否出现了数字
if (password.matches(".*\\d.*")) {
count++;
}
// 判断是否出现了空格
if (password.matches(".* .*")) {
count++;
}
return count >= 2;
}
relpaceAll
public static void method() {
String str = "gr7g!%&h8rg&*O($@eg6gtght5reg";
// 将字符串中的数字全部替换成-
System.out.println(str.replaceAll("\\d", "-"));
// 获取这个字符串中所有的数字
System.out.println(str.replaceAll("\\D", ""));
// 替换字符串中的所有的非字母
System.out.println(str.replaceAll("[^a-zA-Z]", ""));
// 交换字符串的内容
String str2 = "范冰冰 李晨 张柏芝 陈冠希";
System.out.println(str2.replaceAll("(.*)(李晨)(.*)(陈冠希)", "$1$4$3$2"));
// 把叠字变成单字
String str3 = "我我我我我我我爱爱爱爱爱爱你你你你你你你你";
System.out.println(str3.replaceAll("(.)\\1+", "$1"));// 输入一个字符串,统计每一个字符出现的次数
// aaabbcccadd
}
private static void demo3() {
String str = new Scanner(System.in).next();
// 如果字符串中有内容
while (str.length() != 0) {
// 获取替换之前的字符串的长度
int oldLen = str.length();
// 获取字符串的第一个字符
char c = str.charAt(0);
String regex = "";
if (c == '+' || c == '*' || c == '?' || c == '$' || c == '\\') {
regex = "\\" + c;
} else {
regex = c + regex;
}
//把字符替换成 ""
str = str.replaceAll(regex, "");
System.out.println("字符" + c + "出现的次数是" + (oldLen - str.length()));
}
}
split
public static void method() {
// String str = "10,110,210,3";
// // 分割字符串
// String[] split = str.split(",");
// for (String s : split) {
// System.out.println(s);
// }
String str = "11gfreg998grg8hth7hth9567567";
// 分隔符如果是在最后,会直接被切点,无论有多少个
// 放在中间的分隔符,如果有多个,超出1个的分隔符每个都会分割一个""
// 放在开头的分隔符,会切出"" 有几个切几个
String[] split = str.split("\\d");
for (String s : split) {
System.out.println(s);
}
}