| 匹配 | |
| 字符 | |
| x | 字符 x |
| \\ | 反斜线字符 |
| \t | 制表符 ('\u0009') |
| \n | 新行(换行)符 ('\u000A') |
| \r | 回车符 ('\u000D') |
| \f | 换页符 ('\u000C') |
| \a | 报警 (bell) 符 ('\u0007') |
| \e | 转义符 ('\u001B') |
| 字符类 | |
| [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](减去) |
| 预定义字符类 | |
| . | 任何字符(与行结束符可能匹配也可能不匹配) |
| \d | 数字:[0-9] |
| \D | 非数字: [^0-9] |
| \s | 空白字符:[ \t\n\x0B\f\r] |
| \S | 非空白字符:[^\s] |
| \w | 单词字符:[a-zA-Z_0-9] |
| \W | 非单词字符:[^\w] |
| 边界匹配器 | |
| ^ | 行的开头 |
| $ | 行的结尾 |
| \b | 单词边界 |
| \B | 非单词边界 |
| \A | 输入的开头 |
| \G | 上一个匹配的结尾 |
| \Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
| \z | 输入的结尾 |
|
|
|
| Greedy 数量词 | |
| X? | X,一次或一次也没有 |
| X* | X,零次或多次 |
| X+ | X,一次或多次 |
| X{n} | X,恰好 n 次 |
| X{n,} | X,至少 n 次 |
| X{n,m} | X,至少 n 次,但是不超过 m 次 |
|
|
|
| Reluctant 数量词 | |
| X?? | X,一次或一次也没有 |
| X*? | X,零次或多次 |
| X+? | X,一次或多次 |
| X{n}? | X,恰好 n 次 |
| X{n,}? | X,至少 n 次 |
| X{n,m}? | X,至少 n 次,但是不超过 m 次 |
|
|
|
| Possessive 数量词 | |
| X?+ | X,一次或一次也没有 |
| X*+ | X,零次或多次 |
| X++ | X,一次或多次 |
| X{n}+ | X,恰好 n 次 |
| X{n,}+ | X,至少 n 次 |
| X{n,m}+ | X,至少 n 次,但是不超过 m 次 |
|
|
|
| Logical 运算符 | |
| XY | X 后跟 Y |
| X|Y | X 或 Y |
| (X) | X,作为捕获组 |
//匹配手机号码是否正确。
String str = "15158041079";
boolean b = str.matches("1[358]\\d{9}");//1[358][0-9]{9}
System.out.println(b);
2、切割
(主要用到String类的split方法)
2.1 根据一个或多个点来拆分字符串
public static void main(String[] args) {
String str = "zhangsan...lisi..wangwu";
// 根据一个或多个点来拆分字符串
String[] names = str.split("\\.+");
for (String name : names) {
System.out.println(name);
}
}
lisi
wangwu
public static void main(String[] args) {
String str = "zhangsan666lisitttwangwu";
// "."代表任意字符,(.)把它封装为组,编号为1...n,调用它直接用编号,
//1由于代 表的是正常的 1,用\1将它转义为组编号,由于是在字符串中,再用\\1来转义
String[] names = str.split("(.)\\1+");
for (String name : names) {
System.out.println(name);
}
}
lisi
wangwu
public static void main(String[] args) {
String str = "zhangsanttttlisimmmwangwu";
str = str.replaceAll("(.)\\1+", "$1");// $符号调用了前面参数中的第1组
System.out.println(str);
String tel = "15158041079";
// 括号表示 组 被替换的部分 $n 表示 第n组的内容
tel = tel.replaceAll("(\\d{4})\\d{3}(\\d{4})", "$1****$2");
System.out.println(tel);// 1382****1111
}
输出结果:
1382****1111
4、获取
public static void main(String[] args) {
String str = "da asdf sdf,sdkfh,sdk sdhh jtt!";
String regex = "\\b[a-z]{3}\\b";
// 1,将正则规则进行对象的封装
Pattern p = Pattern.compile(regex);
// 2, 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher 。
Matcher m = p.matcher(str);
// 使用Matcher对象的方法对字符串进行操作。
// 既然要获取三个字母组成的单词
// 查找 find();
System.out.println(str);
while (m.find()) {
System.out.println(m.group());// 获取匹配的子序列
}
}输出结果:
sdf
sdk
jtt
网页爬虫:
/*
* 网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。 爬取邮箱地址。
*/
public static void main(String[] args) throws IOException {
List<String> list = getMails();
for (String mail : list) {
System.out.println(mail);
}
}
public static List<String> getMails() throws IOException {
// 1,读取源文件。
BufferedReader bufr = new BufferedReader(
new FileReader("D:\\mail.html"));
// 2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while ((line = bufr.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
// 3,将符合规则的数据存储到集合中。
list.add(m.group());
}
}
bufr.close();
return list;
}
本文深入解析Java正则表达式的基础应用,涵盖匹配、切割、替换与获取字符串信息的技术细节,通过实例展示如何利用正则表达式处理文本数据,实现高效的数据操作。
3962

被折叠的 条评论
为什么被折叠?



