文章目录
- 一、正则初体验
- 二、匹配规则
- 三、字符串方法的使用
一、正则初体验
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。
比如我们的QQ登录页面,我们需要校验扣扣号码是否正确,我们规定QQ号 6 - 15位,并且全部为数字。
我们先用我们之前所学习的知识进行校验。
public static void main(String[] args) {//需求: 检验一个QQ号是否正确System.out.println(checkQQ("1054645664"));System.out.println(checkQQ("sad1245"));System.out.println(checkQQ(".,45545"));}public static boolean checkQQ(String qq) {//判断长度是否合法if(qq == null || qq.length() < 6 || qq.length() > 15) {return false;}//判断是否全部为数字for (int i = 0; i < qq.length(); i++) {char ch = qq.charAt(i);if(ch < '0' || ch > '9') {return false;}}return true;}
我们再来感受一下正则表达式是怎么判断的。
public static void main(String[] args) {//需求: 检验一个QQ号是否正确System.out.println(checkQQ1("1054645664"));System.out.println(checkQQ1("sad1245"));System.out.println(checkQQ1(".,45545"));}public static boolean checkQQ1(String qq) {return qq != null && qq.matches("\\d{6,20}");}
看到这里我们就能感受到正则表达式的作用了,正则表达式是字符串处理的有力工具。
二、匹配规则
字符类(默认匹配一个字符)
正则表达式 | 作用 |
---|---|
[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&&[def]] | d,e或者f |
[a-z&&[^bc]] | a到z,除了b,c |
[a-z&&[^m-p]] | a到z,除了m到p |
预定义字符类(默认匹配一个字符)
正则表达式 | 作用 |
---|---|
. | 任何字符 |
\d | 一个数字 |
\D | 非数字 |
\s | 一个空白字符(\t\n\x0B\f\r) |
\S | 非空白字符 |
\w | [a-zA-Z_0-9]英文,数字,下划线 |
\W | [^\w]非英文,数字下划线 |
量词(匹配多字符)
正则表达式 | 作用 |
---|---|
X? | 一次或根本不 |
X* | 零次或多次 |
X+ | 一次或多次 |
X{n} | 刚好n次 |
X{n,} | 至少n次 |
X{n,m} | 至少n,不超过m |
我们在使用时,往往都是上面三种一起使用的。
我们字符串对象为我们提供了一个匹配正则表达式规则的API
public boolean matches(String regex);
如果匹配正则表达式返回true,否则返回false.
我们现在试着用正则表达式来校验一下密码是否正确,密码必须是数字,字母,下划线,8-16位。
public static void main(String[] args) {System.out.println("sadasd44".matches("\\w{8,16}"));//正确的密码System.out.println("221244".matches("\\w{8,16}"));//位数不够System.out.println("s,asdasd44".matches("\\w{8,16}"));//非法字符}
我们刚才在学习正则表达式的时候,我们表示数字,字母下划线的时候是用\w表示的,为什么我们在书写的时候用的是\w?
因为我们java种\是个很特殊的字符,我们先不加试试看
报了一个字符串种存在非法转义字符,我们\w,的目的是将\转义为一个真正意义上的.
那如果我们的密码校验规则现在只允许出现数字字母,我们该怎么校验呢?因为\w是包含下划线的,我们先使用另一种方法。
public static void main(String[] args) {System.out.println("asdas244".matches("[a-zA-Z0-9]{8,16}"));System.out.println("as__s244".matches("[a-zA-Z0-9]{8,16}"));}
那我们要想用\w,我们可以去除_这个字符
public static void main(String[] args) {System.out.println("asdas244".matches("\\w&&^_{8,16}"));System.out.println("as__s244".matches("\\w&&^_{8,16}"));}
我们可以发现,我们和上面得到的结果不一致,既然出错了,肯定是我们的使用方式不对。
我们可以发现,在使用&&非操作时,需要把非括号括起来
public static void main(String[] args) {System.out.println("asdas244".matches("[\\w&&[^_]]{8,16}"));System.out.println("as__s244".matches("[\\w&&[^_]]{8,16}"));}
当我们改正后,达到了预期的效果。
三、字符串方法的使用
方法名 | 说明 |
---|---|
replaceAll(String s,String news) | 按照正则表达式进行替换 |
spilt(String s) | 按照正则表达式进行分割,返回字符串数组 |
public static void main(String[] args) {String names = "张三asdasd李四142王五";String[] arr = names.split("\\w+");for (String s : arr) {System.out.print(s+" ");}}
之前我们学过一个替换空格的问题。
public static void main(String[] args) {String s = "a b c d";String[] s1 = s.split(" ");for (String s2 : s1) {System.out.print(s2+" ");}}
我们可以发现我们分割空格的话,并没有达到我们预期的效果,这里我们可以使用正则表达式的方式进行分割。
public static void main(String[] args) {String s = "a b c d";String[] s1 = s.split("\\s+");for (String s2 : s1) {System.out.print(s2+" ");}}
public static void main(String[] args) {String names = "张三asdasd李四142王五";String s = names.replaceAll("\\w+", " ");System.out.println(s);}