正则表达式举例说明

时间:2022-10-26 14:49:38
    /*
* 需求:校验qq号
* 要求:长度5-15;只能是数字;0不能开头
*/
public static void checkQQ(String qq){
int length=qq.length();
if(length>=5&&length<=15){
if (!qq.startsWith("0")) {
try {
Long l
=Long.parseLong(qq);
System.out.println(
"正确!");
}
catch (NumberFormatException e) {
System.out.println(qq
+":不是数字错误!");
}
}
else {
System.out.println(qq
+":0开头错误!");
}
}
else {
System.out.println(qq
+":长度错误!");
}
}
正则表达式举例说明

在正则表达式面前,它显然有些麻烦,但是它还是有优点就是易读,很容易看懂代码意思。

使用正则表达式,代码就变成了

正则表达式举例说明
    public static void checkQQByRegex(String qq){
String regex
="[1-9][0-9]{4,14}";
boolean b=qq.matches(regex);
System.out.println(qq
+":"+b);
}

简单的正则表达式,却不容易读懂,因此我们需要记很多符号代表的意思。

 

二、一些常用需要记忆的符号

字符类
[abc] abc(简单类)
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](减去)
[a-z&&[^m-p]] az,而非 mp[a-lq-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

 

三、常用功能

  1、匹配:其实就是String类中matches方法

正则表达式举例说明
正则表达式举例说明
/*
* 匹配功能
* 需求:校验手机号
* 要求:11位,开头13、15、18
*/
public static void fun1() {
String phone
="13511110000";
String regex
="1[358]\\d{9}";//等同于String regex="1[358][0-9]{9}"
boolean b=phone.matches(regex);
System.out.println(phone
+":"+b);
}
正则表达式举例说明

  2、替换:其实就是String类中replaceAll方法,不是replace方法

正则表达式举例说明
正则表达式举例说明
/*
* 替换功能
* 需求:将已知电话号码,替换成形如152****0000
*/
public static void fun3() {
String phone
="15200001111";
String newPhone
=phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//$1取前一个表达式中第一组
System.out.println(newPhone);

}
正则表达式举例说明

  3、切割:其实就是String类中split方法

正则表达式举例说明
正则表达式举例说明
/*
* 切割功能
* 需求:从字符串叠词部分切割
*/
public static void fun2() {
String s
="张三@@@李四aaa王五";
String regex
="(.)\\1+";//.任意字符,()组,\1取第一组,+至少出现一次
String strs[]=s.split(regex);
for (String string : strs) {
System.out.println(string);
}
}
正则表达式举例说明

  4、获取:为了String类方便提供了上面方法,其实底层都是使用了Pattern类

正则表达式举例说明
正则表达式举例说明
    /*
* 获取功能
* 需求:获取“da jia hao,wo shi zhang san!”中三个字母组成的字符串
*/
public static void fun4() {
String s
="da jia hao,wo shi zhang san!";
String regex
="\\b[a-z]{3}\\b";//单词边界\b
Pattern p=Pattern.compile(regex);//将正则封装成对象
Matcher m=p.matcher(s);//绑定字符串获取匹配器
//使用匹配器的find方法
while (m.find()) {//find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
System.out.println(m.group());//返回由以前匹配操作所匹配的输入子序列。
}
}
正则表达式举例说明

四、练习

  1、治口吃

正则表达式举例说明
正则表达式举例说明
/*
* 需求:治口吃
*/
public static void kouchi() {
String s
="我我我我....要要要要要要...学学..加..瓦!";
//第一步替换...
String s2=s.replaceAll("\\.+", "");
//第二部替换叠词
String s3=s2.replaceAll("(.)\\1+", "$1");
System.out.println(s3);
}
正则表达式举例说明

  2、对ip地址排序

正则表达式举例说明
正则表达式举例说明
    /*
* 需求:对ip地址进行排序
*/
public static void ipSort() {
String s
="192.168.0.1 127.0.0.1 133.1.1.1 88.0.192.1";
Set
<String> set=new TreeSet<String>();//使用treeset排序的功能
//截取字符串,放入set中,因为字符长度不同,所以排序失败,所以需要补0
s=s.replaceAll("(\\d+)", "00$1");//00127.000.000.001
//保留3位数
s=s.replaceAll("\\d+(\\d{3})", "$1");//088.000.192.001
String strs[]=s.split(" +");
for (String string : strs) {
set.add(string);
}
for (String str : set) {
//去除0打头和两位0
str=str.replaceAll("0{1,2}(\\d+)", "$1");
System.out.println(str);
}
}
正则表达式举例说明

  3、对邮箱进行校验

正则表达式举例说明
正则表达式举例说明
/*
* 邮箱地址校验
*/
public static void checkMail() {
String mail
="zhangsan@sina.com.cn";
String regex
="\\w+@\\w+(\\.\\w+)+";
boolean b=mail.matches(regex);
System.out.println(mail
+":"+b);

}
正则表达式举例说明

  4、网页爬虫获取邮箱

正则表达式举例说明
正则表达式举例说明
    /*
* 网页爬虫获取邮箱
*/
public static List<String> getMail(String addr) throws Exception {
URL url
=new URL(addr);
BufferedReader br
=new BufferedReader(new InputStreamReader(url.openStream()));//获取输入流
Pattern p=Pattern.compile("\\w+@\\w+(\\.\\w+)+");//封装
Matcher m=null;
String s
=null;
List
<String> mails=new ArrayList<String>();
while ((s=br.readLine())!=null) {
m
=p.matcher(s);//绑定字符串
while (m.find()) {
mails.add(m.group());
}
}
return mails;
}