按照套路来,先上一段概念
正则表达式:正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。(英语:Regular Expression,在代码中常简写为regex)
先来个小例子
写一个检查QQ号是否是合法的正则,当然我们需要先确定QQ号的规则
1.开头不能是 0
2.全是数字
3.位数为 5 - 8 位
说来就来,上代码
[1-9][0-9]{4,9}
虽然很简单,但是我还是要强行解释一下:
1. [1-9] 代表的是第一位是需要符合数字 1 - 9 其中的一个
2. [0-9] 代表的是第二位是需要符合数字 0 - 9 其中的一个
3. {4,9} 代表的是这样的第二位可以出现 4 - 9 次
4.在正则表达式中,中括号就表示一位,当然也可以不写中括号,直接写规则
接下来就先介绍一下正则表达式的匹配规则,然后列举一些例子去实现,偷个懒。。。注释写的很详细
public class Regex {
/*
* 实现正则规则和字符串进行匹配,需要用到的String类方法
*
* boolean matches(String 正则的规则)
* "demo".matches("[a]") 匹配成功返回 true
*
* String [] split(String 正则的规则)
* "abc".split("a") 使用规则将字符串进行切割
*
* String replaceAll(String 正则的规则)
* "abc123".relaceAll("[\\d]","#") 按照正则的规则替换字符串
* 把数字全部替换成 #
*
* \d :对 d 进行转义,使 d 失去原有的意义
* \\d : 把 \ 进行转义,所以规则数字要写成 \\d
* \\D : 取反,匹配不是数字
*
*/
public static void main(String[] args) {
checkQQ("1234567");
checkTel("18842606495");
//按照 - 对字符串进行切割
mySplit("-","01-02-03-04-05-06-07");
//按照空格对字符串进行切割 + 代表空格出现一次或者多次都进行匹配,都切掉
mySplit(" +" ,"12 13 14 15 16");
//对 IP 地址进行切割 如果只写一个 . 代表任意字符,必须进行转义,正则里 \\ 算一个
mySplit("\\.+","192.168.0.100");
//对 W123Y456 里面的数字进行替换成 *
myReplaceAll("[\\d]", "W123y456","*");
//使 * 只出现一次
myReplaceAll("[\\d]+", "W123y456","*");
checkMail("ningwy1314@163.com");
}
/**
* 检查是否是QQ号
* @param qq
*/
public static void checkQQ(String qq) {
boolean b = qq.matches("[1-9][\\d]{4,9}");
System.out.println("检测是否是QQ号: " + b);
}
/**
* 检查是否是手机号
* 规则:第一位是 1; 第二位是 34578 一共有是十一位
* @param tel
*/
public static void checkTel(String tel) {
boolean b = tel.matches("1[34578][\\d]{9}");
System.out.println("检测是否是电话号: " + b);
}
/**
* 对字符串按着正则规则进行切割
* @param regex 正则规则
* @param string 需要切割的字符串
*/
public static void mySplit(String regex,String string) {
String strArray [] = string.split(regex);
for (String str : strArray) {
System.out.print(str + " ");
}
System.out.println();
}
/**
* 对字符串按照正则规则进行替换
* @param regex 正则规则
* @param string 要进行处理的字符串
* @param replace 替换的内容(替换成这个字符串)
*/
public static void myReplaceAll(String regex,String string,String replace) {
String str = string.replaceAll(regex, replace);
System.out.println(str);
}
/**
* 检查是邮箱格式是否正确
* @param regex
* @param mail
*
* 123@qq.com
* 345@163.c,o
* wttttt@yahoo.com.cn
*
* 邮箱规则:
* @前 : 内容 [数字字母下划线] 个数不能少于一个
* @后 : 内容 [数字字母] 个数不能少于一个
* .后 : 内容 [字母] 个数不能少于一个(这个格式不能少于一个,如:.com.cn 所以规则为:(\\.[a-z]+)+
*/
public static void checkMail(String mail) {
boolean b = mail.matches("[a-zA-Z0-9_]+@[a-z0-9]+(\\.[a-z]+)+");
System.out.println("邮箱格式是否正确: " + b );
}
}
这是一些常用的正则规则,在 API Pattern 类中有详细介绍:
字符:x
含义:代表的是字符x
例如:匹配规则为 “a”,那么需要匹配的字符串内容就是 ”a”
字符:\
含义:代表的是反斜线字符’\’
例如:匹配规则为”\” ,那么需要匹配的字符串内容就是 ”\”
字符:\t
含义:制表符
例如:匹配规则为”\t” ,那么对应的效果就是产生一个制表符的空间
字符:\n
含义:换行符
例如:匹配规则为”\n”,那么对应的效果就是换行,光标在原有位置的下一行
字符:\r
含义:回车符
例如:匹配规则为”\r” ,那么对应的效果就是回车后的效果,光标来到下一行行首
字符类:[abc]
含义:代表的是字符a、b 或 c
例如:匹配规则为”[abc]” ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个
字符类:[^abc]
含义:代表的是除了 a、b 或 c以外的任何字符
例如:匹配规则为”[^abc]”,那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符
字符类:[a-zA-Z]
含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内
例如:匹配规则为”[a-zA-Z]”,那么需要匹配的是一个大写或者小写字母
字符类:[0-9]
含义:代表的是 0到9数字,两头的数字包括在内
例如:匹配规则为”[0-9]”,那么需要匹配的是一个数字
字符类:[a-zA-Z_0-9]
含义:代表的字母或者数字或者下划线(即单词字符)
例如:匹配规则为” [a-zA-Z_0-9] “,那么需要匹配的是一个字母或者是一个数字或一个下滑线
预定义字符类:.
含义:代表的是任何字符
例如:匹配规则为” . “,那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则”\.”来实现
预定义字符类:\d
含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9]
例如:匹配规则为”\d “,那么需要匹配的是一个数字
预定义字符类:\w
含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]
例如:匹配规则为”\w “,,那么需要匹配的是一个字母或者是一个数字或一个下滑线
边界匹配器:^
含义:代表的是行的开头
例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号
边界匹配器: 含义:代表的是行的结尾例如:匹配规则为[abc][0−9] 含 义 : 代 表 的 是 行 的 结 尾 例 如 : 匹 配 规 则 为 [ a b c ] [ 0 − 9 ] ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号
边界匹配器:\b
含义:代表的是单词边界
例如:匹配规则为”\b[abc]\b” ,那么代表的是字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])
数量词:X?
含义:代表的是X出现一次或一次也没有
例如:匹配规则为”a?”,那么需要匹配的内容是一个字符a,或者一个a都没有
数量词:X*
含义:代表的是X出现零次或多次
例如:匹配规则为”a*” ,那么需要匹配的内容是多个字符a,或者一个a都没有
数量词:X+
含义:代表的是X出现一次或多次
例如:匹配规则为”a+”,那么需要匹配的内容是多个字符a,或者一个a
数量词:X{n}
含义:代表的是X出现恰好 n 次
例如:匹配规则为”a{5}”,那么需要匹配的内容是5个字符a
数量词:X{n,}
含义:代表的是X出现至少 n 次
例如:匹配规则为”a{5, }”,那么需要匹配的内容是最少有5个字符a
数量词:X{n,m}
含义:代表的是X出现至少 n 次,但是不超过 m 次
例如:匹配规则为”a{5,8}”,那么需要匹配的内容是有5个字符a 到 8个字符a之间