正则表达式以及案例
语法规则
元字符-匹配规则
规则:.
含义:句号匹配任意单个字符除了换行符
规则:x
含义:代表的是字符 x
例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”
[]表示可能出现的数据类型 范围用- ,也可以枚举
规则:[abc]
含义:代表的是字符 a、b 或 c 匹配括号内任意字符
例如:匹配规则为"[abc]",那么需要匹配的内容就是字符 a,或者字符 b,或字符 c 的一个
规则:[^abc]
含义:代表的是除了 a、b 或 c 以外的任何字符
例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符 a,或者不是字符 b,或不是字符
c 的任意一个字符
\转义符
规则:\\
含义:代表的是斜线字符'\'
例如:匹配规则为"\\" ,那么需要匹配的字符串内容就是 ”\”
system.out.println(str.matches("\\\\")) 正则中\\对应字符串一个\
规则:[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 数字,0 和 9 包括在内。
例如:匹配规则为"\\d ",那么需要匹配的是一个数字
规则:\\w
含义:相当于[a-zA-Z_0-9]。代表的字母或者数字或者下划线
例如:匹配规则为"\\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线
边界匹配器:^
含义:代表以某些内容开头
边界匹配器:$
含义:代表以某些内容结尾
边界匹配器:\b
含义:代表的是单词边界。
注意:不能单独使用,几乎不使用
例如:匹配规则为"\b[abc]\b",那么代表的是字母 a 或 b 或 c 的左右两边需要的是非单词字符
元字符-重复次数
规则:*
含义:匹配前面的子表达式零次或多次。
例如:zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}
规则:?
含义:匹配前面的子表达式零次或一次。
例如:"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。
规则:{n,m}
含义:匹配前面的子表达式n到m次。
例如:{}表示重复前一个表达式的次数
{n}表示重复n次
{n,m}表示重复n-m次
{n,} 至少匹配n次
小练习demo
1、vin 车架号
/**
* 1.数字加大写字母,长度17位;
* 2.字母不会出现O、Q、I三个字母
* 3.第9位只能是【0-9】的数字和字母X;
* 4.第13-17位只能是数字;
*/
public class zz {
public static void main(String[] args) {
String hex = "L6T76F2Z4MF048035";
String regex = "^[A-HJ-NPR-Z\\d]{8}[X\\d][A-HJ-NPR-Z\\d]{3}\\d{5}$";
System.out.println(hex.matches(regex));
}
}
### 2、验证是否为有效数字
/**
* 验证是否为有效数字
* 规则分析:
* 1.可能出现 + - 符号,也可能不出现 => [+-]?
* 2.如果是一位数 0-9 都可以,如果是多位数字 首位不能是 0 => (\d|([1-9]\d+))
* 3.如果是小数的话,那么后面必须有小数点和数字 => (\.\d+)?
*/
public class zz {
public static void main(String[] args) {
String hex = "+23";
String regex = "^[+-]?(\\d|([1-9]\\d+))(\\.\\d+)?$";
System.out.println(hex.matches(regex));
}
}
3、验证密码
/**
* 验证密码
* 1.组成的元素例如有数字、字母、下划线
* 2.长度 6- 16 位
*/
public class zz {
public static void main(String[] args) {
String hex = "Lysicy";
String regex = "^\\w{6,16}$";
System.out.println(hex.matches(regex));
}
}
### 4、验证真实姓名
/**
* 验证真实姓名
* 1.汉字 /^[\u4E00-\u9FA5]$/
* 2.名字长度例如 2-10
* 3.可能有译名 .汉字
*/
public class zz {
public static void main(String[] args) {
String hex = "饿的一笔想吃肯德基";
String regex = "^[\\u4E00-\\u9FA5]{2,10}(\\.[\\u4E00-\\u9FA5]{2,10})?$";
System.out.println(hex.matches(regex));
}
}
5、验证邮箱
/**
* 验证邮箱
* 规则分析:
* 1、开头是数字字母下划线(1到多位)
* 还可以是 -数字字母下划线 或者 .数字字母下划线,整体零到多次
* => 邮箱的名字由“数字、字母、下划线、-,.”几部分组成 ,但是-/. 不能连续出现也不能作为开始
* => \w+((-\w+)|(\.\w+))*
*
* 2、@ 后面紧跟着:数字、字母 (1-多位) => @[A-Za-z0-9]+
* 3、对@ 后面名字的补充
* 多域名 .com.cn
* 企业邮箱 => xxx@ xxx.com
*/
public class zz {
public static void main(String[] args) {
String hex = "12345667@qq.com";
String regex = "^\\w+((-\\w+)|(\\.\\w+))*@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$";
System.out.println(hex.matches(regex));
}
}
### 6、身份证号码
/**
* 身份证号码
* 1.一共是18位
* 2.最后以为可能是X
*/
public class zz {
public static void main(String[] args) {
String hex = "33028219990908919X";
String regex = "^\\d{17}(\\d|X)$";
System.out.println(hex.matches(regex));
}
}
7、验证iccid
/**
* ICCID:Integrate circuit card identity 集成电路卡识别码即SIM卡卡号,相当于手机号码的身份证。
* ICCID为IC卡的识别号码,共有20位字符组成,
* 其编码格式为:XXXXXX 0MFSS YYGXX XXXX。分别介绍如下:
* 前六位运营商代码:中国移动的为:898600;898602;898604;898607
* ,中国联通的为:898601、898606、898609,中国电信898603、898611。
*/
public class zz {
public static void main(String[] args) {
String hex = "8986000MFSSYYG334445";
String regex = "^(898600|898602|898604|898607|898601|898606|898609|898603|898611)0MFSSYYG[A-Z0-9]{6}$";
System.out.println(hex.matches(regex));
}
}
匹配的常用方法
/**
* 查找以222结尾的数据
*/
public class zz {
public static void main(String[] args) {
String pattern = "222$";
String str = "1133fe1222";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
//全字符匹配
System.out.println(m.matches());
//字符串是否满足表达式,1次即可
System.out.println(m.find());
//返回匹配表达式的第一个字符下标,从0开始
System.out.println(m.start());
//返回匹配表达式的最后一个下标
System.out.println(m.end());
}
}