日常开发中我们经常会遇到验证用户输入信息的地方,而某些验证就要用到正则表达式。之前总感觉正则神秘莫测,如果你也有同感?那接下来将为你揭开它神秘的面纱。
基本概念
正则表达式:具有一定规则的字符串。
组成规则
常用组成规则:
字符
x 字符 x
\\ 反斜线字符
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
更多规则查看API Pattern类
如果看到这些规则感到比较困惑,请看下面实例!
1.判断功能
String类提供了matches()判定字符串是否匹配给定的正则表达式。
比如验证用户输入的邮箱是否合法?
public class Test {
public static void main(String[] args) {
// 不考虑@符号前字符个数限制的问题
// magic@163.com
// hello@vip.sina.com
// 123ak48@yeah.net
// 981075006@qq.com
// 测试邮箱
String email = "magic@163.com";
// 规则
String regex = "[a-zA-Z_0-9]+@([a-zA-Z_0-9]{2,4}\\.)+[a-zA-Z]{3}";
//String regex = "\\w+@(\\w{2,4}\\.)+[a-zA-Z]{3}";//可以替换为这个
// 判定
boolean b = email.matches(regex);
System.out.println(b);// true
//由于@字符后magic串长度不符合{2,4}至少 2 次,但是不超过 4次规则,所以返回false
String email2 = "hello123@magic.com";
boolean b2 = email2.matches(regex);
System.out.println(b2);// false
}
}
注:一般可以将邮箱分为四个部分[用户申请名][@符号][二级域名部分.][顶级域名部分],上面测试邮箱中,用户申请名包含纯字符,纯数字,字符数字混合统一来说就是字符 所以用[a-zA-Z_0-9]代替,后面的+是(X+ X,一次或多次 )代表字符个数; @符号是唯一的所以只写@,后面未标识数量默认是一; 二级域名部分163. yeah. qq. vip.字符长度最小为2,最大为4,所以为\w{2,4}\. 但是由于vip.后面多了个sina.所以\w{2,4}\.这个匹配数量为 一次或多次为([a-zA-Z_0-9]{2,4}\.)+;顶级域名部分为com com net com 都是字符且字符数量都是3,所以为[a-zA-Z]{3}。
2.分割功能
String类提供了split()根据给定正则表达式的匹配拆分此字符串。
比如获取Url的传输协议是https还是http?
//url
String url = "http://www.baidu.com";
String url = "https://www.tmall.com";
//指定分割规则,返回字符串数组
String[] strs = url.split("://");
System.out.println(strs[0]);// http
System.out.println(strs[1]);// www.baidu.com
3.替换功能
String类提供了replace()替换此字符串所有匹配给定的正则表达式的子字符串。
//newChar 替换此字符串中出现的所有 oldChar
String replace(char oldChar, char newChar)
//字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
String replace(CharSequence target, CharSequence replacement)
//replacement 替换此字符串所有匹配给定的正则表达式的子字符串
String replaceAll(String regex, String replacement)
// replacement 替换此字符串匹配给定的正则表达式第一个子字符串
String replaceFirst(String regex, String replacement)
比如替换字符串中的双11.11为*?
//测试字符串、替换掉字符串中的双11
String s="Sea surface Ch11.11oudai focusing ,wa11.11rm spring flo11.11wers.";
//替换规则
String regex3="\\d+\\.\\d+";//表示0-9的数字出现一次或多次 (.) 0-9的数字出现一次或多次
//参数指定替换后的字符
String ss=s.replaceAll(regex3,"*");
System.out.println(ss);//Sea surface Ch*oudai focusing , wa*rm spring flo*wers.
4.获取功能
获取功能需要模式对象Pattern类和匹配对象Matcher共同完成。
比如获取字符串中为两位数字的数据?
// 测试字符串数据
String s = "Sea surface Ch11.11oudai focusing , wa11.11rm spring flo11.11wers. ";
// 规则
String regex4 = "\\d{2}";//表示0-9的数字出现2次
// 生成模式对象
Pattern pattern = Pattern.compile(regex4);
// 生成匹配对象
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String ss = matcher.group();
System.out.print(ss + " ");
}
// 最终输出 11 11 11 11 11 11
注:正则表达式基本使用就这些,不需要记,如果用到了查查API即可!