前言
正则表达式是一个强大的字符串操作工具,能实现复杂格式的字符串匹配、替换、分割、搜索等。
正则表达式在各种语言中都支持,如:java、Javascript、python等,语法是通用的。
正则表达式由各种符号组成,关键点就是学习这些符号的使用。
字符匹配
用[]匹配单个字符,()匹配多个单词
符号 | 用法 |
---|---|
[abc] | 查找在方括号中的任意一个字符 |
[^abc] | 查找不在方括号中的任意一个字符 |
[0-9] | 查找0-9中的任意一个数字 |
[a-z] | 查找从小写a到z中的任意一个字符 |
(red|blue|green) | 查找小括号中的任意一项 |
开头和结尾
- ^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串
- $ 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串
在正则表达式的开头和结尾添加^和$,可以有效匹配完整的字符串:
/^表达式$/
元字符
符号 | 用法 |
---|---|
. | 查找任意的单个字符,除换行符外 |
\w | 任意一个字母或数字或下划线,[A-Za-z0-9_]中任意一个 |
\W | 查找非单词的字符,等价于[^A_Za_z0_9_] |
\d | 匹配一个数字字符,等价于[0-9] |
\D | 匹配一个非数字字符,等价于[^0-9] |
\s | 匹配任何空白字符,包括空格,制表符,换行符等等。等价于[\f\n\r\t\v] |
\S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] |
\b | 匹配单词边界,单词和空格间的位置,如’er\b’可以匹配”never”中的”er”,但不能匹配”verb”中的”er” |
\B | 匹配非单词边界,’er\B’能匹配’verb’中的’er’,但不能匹配’never’中的’er’ |
\0 | 查找NUL字符。 |
\n | 匹配一个换行符 |
\f | 匹配一个换页符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\xxx | 查找一个以八进制数xxx规定的字符 |
\xdd | 查找以16进制数dd规定的字符 |
\uxxxx | 查找以16进制数的xxxx规定的Unicode字符。 |
量词
符号 | 用法 |
---|---|
n+ | 匹配任何至少包含一个n的字符串 |
n* | 匹配零个或者多个n的字符串 |
n? | 匹配零个或者1个n的字符串 |
n{x} | 匹配包含x个n的序列字符串 |
n{x,y} | 匹配至少x个,最多y个n的字符串 |
n{x,} | 匹配至少x个的字符串 |
n$ | 匹配以n结尾的字符串 |
^n | 匹配以n开头的字符串 |
?=n | 匹配其后紧接指定的n字符串 |
?!n | 匹配其后没有紧接指定的n字符串 |
常用的正则表达式
一些常用的正则表达式
手机号
^1[3|4|5|7|8]\d{9}$
小数
^(-?\d+)(\.\d+)?$
邮箱地址
[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}
HTML标签
/<(.*)>.*<\/\1>|<(.*) \/>/
中文字符
[\u4e00-\u9fa5]
QQ号
(\d+)\.(\d+)\.(\d+)\.(\d+)
IP
(\d+)\.(\d+)\.(\d+)\.(\d+)
使用正则表达式
Java实现正则表达式的匹配的API:
- Pattern 表达模式
- Matcher 匹配器
Pattern类
创建方法
Pattern.compile(regEx)
忽略大小写
Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher类
创建方法
pattern对象.matcher(字符串)
常用方法
- boolean matches() 是否匹配完整字符串
邮箱验证案例
public static void main(String[] args) {
// 要验证的字符串
String str = "service@xsoftlab.net";
// 邮箱验证规则
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
// 字符串是否与正则表达式相匹配
boolean rs = matcher.matches();
System.out.println(rs);
}
常用方法
- boolean find() 是否能在字符串中搜索到定义的内容
- String group(String name) 返回搜索到的字符串内容
在多个img标签中搜索src的内容
String str = "<img src=\"http://www.xx.com/1.jpg\"><img src=\"http://www.xx.com/2.jpg\">";
Pattern pattern = Pattern.compile("<img src=\"(?<url>.+?)\">");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group("url"));
}
String
String类中的一些方法也都使用了正则表达式
如:
- String replaceAll(String regex,String replacement)
- boolean matches(String regex)
- String[] split(String regex)
将数字替换为*
String str = "123456Java";
String str2 = str.replaceAll("\\d", "*");
匹配手机号
String tel = "1567667443";
boolean matches = tel.matches("^1[3|4|5|7|8]\\d{9}$");
分割字符
String words = "中国.湖北.武汉";
String[] strings = words.split("\\.");
结束
大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总