正则表达式是由普通字符(a-z)和特殊字符(元字符)组成的文本模式。例如,在正则表达式“[a-z]*”描述了所有仅包含小写字母的字符串,其中a,z为普通字符,连字符、左右中括号及星号则为元字符
正则表达式中的元字符的类别
1. 点号
点号可以匹配除“\n”之外的任何单字符 。
2. 中括号
可以在中括号([])内指定需要匹配的若干字符,表示仅使用这些字符参与匹配。
3. 竖线
竖线(|)可以匹配其左侧或右侧的符号。
4. ^符号
^符号可以匹配一行的开始。
5. 美元符号
美元符号($)可以匹配一行的结束。
6. 反斜线
反斜线()表示其后的字符是普通字符而非元字符。
常用的匹配次数元符号
| 元字符 | 含义 |
|---|---|
| x* | 匹配x出现零次或多次,如y、yxxxy |
| x+ | 匹配x出现一次或多次,如yxy、yxx |
| x? | 匹配x出现零次或一次,如y、yxy |
| x{n} | 匹配x恰好出现n次 |
| x{n,} | 匹配x出现至少n次 |
| x{n,m} | n<=m,匹配x出现至少n次,最多m次 |
预定义字符(只匹配一个字符)
| 元字符 | 含义 |
|---|---|
| \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 | 上一个匹配的结尾 |
自定义字符(只匹配一个字符)
| 元字符 | 含义 |
|---|---|
| [abc] | 只能是a,b或c |
| [^abc] | 除了a,b,c之外的任何字符 |
| [a-za-z] | a到z a到z,包括(范围) |
| [a-d[m-p]] | a到d,或m到p |
| [a-z&&[bcd]] | a-z和bcd的交集,为b,c,d |
| [a-z&&[^bcd]] | a-z和非bcd的交集,等同于[ae-z] |
| [a-z&&[^m-p]] | a-z和除了m到p的交集,等同于[a-lq-z] |
举例如下
import java.util.arraylist;
import java.util.list;
//通过正则表达式来提取访问数据中的人物姓名并进行去重
public class mymain {
public static void main(string[] args) {
string log = "张三10:23:0:802023-10-09 09:21:22"
+ "李四115:203:10:1802023-05-09 19:21:22"
+ "王五115:203:10:1802023-05-09 19:21:22"
+ "张三11:22:0:802024-11-09 07:21:25";
// 解析出姓名并写入到list
string[] nameips = log.split("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
// 该list中的姓名可能会出现重复
list<string> names = new arraylist<string>();
for(string nameip : nameips) {
int index = -1;
//找到第一个数字的地址,结束内层循环
for (int i = 0; i < nameip.length(); i++) {
if(nameip.charat(i) >= '0' && nameip.charat(i) <= '9') {
index = i;
break;
}
} // 内层for
//截取名字部分,即从零到第一个数字的部分
string name = nameip.substring(0, index);
//向集合之中添加该名字
names.add(name);
}
// 对list中的姓名去重
// 该list中的姓名是唯一的
//定义一个新的集合,用来存放不重复的名字
list<string> nameuniques = new arraylist<string>();
for(string name : names) {
if(!nameuniques.contains(name)) {
nameuniques.add(name);
}
}
for(string name : nameuniques) {
system.out.println(name);
}
}
}
运行结果

其它方面的细节及注意事项
- \为转义字符,用于改变后面那个字符原本的含义,在程序中\\d才表示一个\d的含义。
- 正则表达式是从左到右一个一个去匹配的,一个表达式只对应一个字符。
- matches()方法可以用于判断一个字符串是否满足对应的正则表达式,并返回结果true或者false。
- 如果要求两个范围的交集,需要写符号&&,若只写一个&,则只表示一个&符号。
总结
到此这篇关于正则表达式整理与归纳的文章就介绍到这了,更多相关正则表达式例子内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论