Java语言学习笔记:正则表达式(一)
什么是正则表示?
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
匹配正则表达式的方法--由字符串对象提供
public boolean matches(String regex);//判断是否匹配正则表达式,匹配返回true,不匹配返回false
比如,
System.out.println("3".matches("[0-9]"));
规则介绍
1. 预定义的字符类,默认匹配一个字符
. 任何字符
\d 一个数字: [0-9]
\D 非数字: [^0-9]
\s 一个空白字符: [ \t\n\x0B\f\r]
\S 非空白字符: [^\s]
\w [a-zA-Z_0-9] 英文、数字、下划线
\W [^\w] 一个非单词字符
举例说明如下
System.out.println("a".matches("\\d"));//false,a不是数字
System.out.println("3".matches("\\d"));//true,因为3是数字
System.out.println("333".matches("\\d"));//false,这个符号只能匹配一个字符,333是作为一个整体来匹配的,所以即使全是数字,也不会匹配成功。
System.out.println(" ".matches("\\s"));//true,空格,但不止空格,\\t,\\n,\\f,\\r,\\x0B等都可以匹配
System.out.println("1".matches("\\s"));//false,1不是空字符
System.out.println("1".matches("\\S"));//true,大S匹配非空字符
System.out.println("z".matches("\\w"));//true,z是一个字母
System.out.println("2".matches("\\w"));//true,2是数字
System.out.println("21".matches("\\w"));//false,只能匹配单个字符
System.out.println("你".matches("\\w"));//false,中文不在w的范围内
System.out.println("你".matches("\\W"));//true,只要不在w的范围内都成功匹配,但并不代表就能匹配中文了,中文有特殊的匹配机制。
2.字符类(示例)也是只能匹配一个字符
[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 b c
System.out.println("a".matches("[abc]"));//true
System.out.println("z".matches("[abc]"));//false
//不能出现a b c
System.out.println("a".matches("[^abc]"));//false
System.out.println("z".matches("[^abc]"));//true
//除了b c 之外的全部小写字母都可以出现
System.out.println("b".matches("[a-z&&[^bc]]"));//false
System.out.println("d".matches("[a-z&&[^bc]]"));//true
3.贪婪量词(配合单个字符匹配规则,决定本规则下出现字符的数量)
X? X , 一次或根本不
X* X,零次或多次
X+ X , 一次或多次
X {n} X,正好n次
X {n, } X,至少n次
X {n,m} X,至少n但不超过m次
举例说明如下
// 以上正则匹配只能校验单个字符
// 校验密码
// 必须是数字 字母 下划线 至少6位
System.out.println("2442hshss".matches("\\w{6,}"));//true
System.out.println("244f".matches("\\w{6,}"));//false
//不带逗号,为正好6次
//验证码 必须是数字和字符 必须是4位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true,表示除了下划线以外的全部w集合的字符(\\w代表数字、字母、下划线)
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
注意事项与心得体会
- 不要乱加空格
- 像^_这种组合形式必须加上中括号,否则会匹配失败(变成只有4个下划线才能匹配成功了,个人理解,因为集合变成了w的集合与^和_的交集,就只有下划线了)
- 贪婪量词可以理解成,先设计好单个字符的规则之后,指定这个规则下,出现字符的数量。
- 带“-”的量词要看成一个整体,纯字母,纯带“-”的集合,可以直接在一起不留空格,但是&&后面的要加方括号。
- 在Java(和Markdown)中,由于字符串转义字符的特殊性,要用“\\”来表示“\”