正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

就像一个任务,校验QQ号是否合法:

1、必须是5-10位的
        2、0不能作为QQ号的开头
        3、必须都是数字

我们如果用双重if语句得这样写:

public class RegularDemo1 {public static void main(String[] args) {String s = "023w2341232";System.out.println(checkQQ(s));}public static boolean checkQQ(String qq){boolean flag = false;//必须是5-10位的if(qq.length() >=5 && qq.length()<=10){//保证不是0开头if(!qq.startsWith("0")){flag = true;//必须都是数字char[] chars = qq.toCharArray();for (char aChar : chars) {if(!Character.isDigit(aChar)){flag = false;break;}}}}return flag;}
}

但是,如果换成正则表达式,我们只需要两行代码即可

 public static boolean checkQQByRegular(String s){//使用正则表达式可以很容易地完成字符串地查找、匹配替换地工作//正则表达式String regex = "[1-9][0-9][4,9]";return s.matches(regex);}

学习正则表达式的目的:通过正则表达式处理了字符串复杂的查找/替换/匹配/分割工作

1001,xiaoliu,18,14

json, xml, html

正则表达式是一个独立于java的技术,不依附于java,它可以在java中使用,也可以在python/JS等中去使用

使用步骤:

1、通过大量的字符串你找规律定义规则

2、使用这种规则去匹配新的字符串

3、匹配成功做出相应的操作

正则表达式的语法规则

1、原义字符

字符本身就是一个正则:a b c \t \n \r \f

public class RegularDemo2 {public static void main(String[] args) {//原义字符String regex = "a";String str = "ab123241dasdasw&;123.";System.out.println(str.replaceAll(regex,"X"));}
}

Xb123241dXsdXsw&;123.

2、元字符

元字符的数量太多,所以我们可以将常用的分为一下几个类别:

字符类:

/*元字符:字符类*/
public class RegularDemo3 {public static void main(String[] args) {//表示格式:[]//[]表示将字符进行归类,可以匹配出现在中括号中的任意一个字符//只要被匹配的字符串中存在a,b,2中任何一个,都会被替换String regex = "[ab2]";String s = "ab123241dasdasw&;123.";System.out.println(s.replaceAll(regex, "_"));//^出现在中括号中,代表的意思式取反,对不是ab2的字符进行匹配regex = "[^ab2]";System.out.println(s.replaceAll(regex, "+"));}
}

输出结果:

__1_3_41d_sd_sw&;1_3.
ab+2+2+++a++a+++++2++

范围类:

其实是在字符类的基础之上增加了范围

/*元字符:范围类 基于字符类的基础之上增加的内容*/
public class RegularDemo4 {public static void main(String[] args) {String regex = "[ab]";String s = "abcdefghijklmnBV1232QWE41dasdasw&;123.";System.out.println("匹配之前:\n" + s);System.out.println("====================================");System.out.println(s.replaceAll(regex, "_"));//[a-z]表示的是匹配a到z中的任意一个小写字母regex = "[a-z]";System.out.println(s.replaceAll(regex, "_"));//[A-Z]表示的是匹配a到z中的任意一个大写字母regex = "[A-Z]";System.out.println(s.replaceAll(regex, "+"));//既想匹配小写又想匹配大写regex = "[a-zA-Z]";System.out.println();System.out.println(s.replaceAll(regex, "#"));//想匹配数字咋办regex = "[0-9]";System.out.println(s.replaceAll(regex, "_"));//既想匹配小写又想匹配大写和数字regex = "[a-zA-Z0-9&;.]";System.out.println(s.replaceAll(regex, "_"));}
}

输出结果:

匹配之前:
abcdefghijklmnBV1232QWE41dasdasw&;123.
====================================
__cdefghijklmnBV1232QWE41d_sd_sw&;123.
______________BV1232QWE41_______&;123.
abcdefghijklmn++1232+++41dasdasw&;123.

################1232###41#######&;123.
abcdefghijklmnBV____QWE__dasdasw&;___.
______________________________________

预定义类:

我们在上面的范围类的情况下我们在实际开发中可能会遇到一些常见的需求,比如:判断是否是数字、小写字母、大写字母等这些情况,对应的范围类的正则会比较长,所以在正则表达式中会给我们预定一些有特殊含义的表达式,正则表达式把我们常见的整理了一下

\d == [0-9] 数字
\D == [^0-9] 非数字
空白字符:[\t\n\x0B\f\r] == \s
[^ \t\n\x0B\f\r] == \S
\w == [a-zA-Z0-9]
\W == [^a-zA-Z0-9]
. 任何字符(与行结束符可能匹配也可能不匹配)

/*\d == [0-9] 数字\D == [^0-9] 非数字空白字符:[\t\n\x0B\f\r] == \s[^ \t\n\x0B\f\r] == \S\w == [a-zA-Z0-9]\W == [^a-zA-Z0-9]. 任何字符(与行结束符可能匹配也可能不匹配)*/
public class RegularDemo5 {public static void main(String[] args) {String regex = "[0-9]";String s = "abcdefghijklmnB V1232Q WE 41dasdasw&;123.";System.out.println("匹配之前:\n" + s);System.out.println("====================================");System.out.println(s.replaceAll(regex, "_"));regex = "\\d"; //[0-9] 匹配所有的数字System.out.println(s.replaceAll(regex, "_"));regex = "\\D"; //匹配所有非数字的字符System.out.println(s.replaceAll(regex, "_"));regex = "\\s"; //匹配所有空白字符System.out.println(s.replaceAll(regex, "!"));regex = "\\S"; //匹配所有非空白字符System.out.println(s.replaceAll(regex, "_"));regex = "\\w"; //匹配所有的大小写字母和数字System.out.println(s.replaceAll(regex, "_"));regex = "\\W"; //匹配所有的非大小写字母和数字System.out.println(s.replaceAll(regex, "_"));regex = "."; //匹配任何字符System.out.println(s.replaceAll(regex, "_"));regex = "\\.";System.out.println(s.replaceAll(regex, "_"));}
}

输出结果

匹配之前:
abcdefghijklmnB V1232Q WE 41dasdasw&;123.
====================================
abcdefghijklmnB V____Q WE __dasdasw&;___.
abcdefghijklmnB V____Q WE __dasdasw&;___.
_________________1232_____41_________123_
abcdefghijklmnB!V1232Q!WE!41dasdasw&;123.
_______________ ______ __ _______________
_______________ ______ __ _________&;___.
abcdefghijklmnB_V1232Q_WE_41dasdasw__123_
_________________________________________
abcdefghijklmnB V1232Q WE 41dasdasw&;123_

边界字符 

^:以xxx开头
$:以xxx结尾
\b:单词边界
\B:非单词边界

/*元字符边界字符^:以xxx开头$:以xxx结尾\b:单词边界\B:非单词边界*/
public class RegularDemo6 {public static void main(String[] args) {//在没有中括号的时候,^代表的是以什么开头String regex = "^ac";String s = "abcdefg";System.out.println("匹配之前:\n" + s);System.out.println("====================================");System.out.println(s.replaceAll(regex, "_"));regex = "fg$";System.out.println(s.replaceAll(regex, "_"));regex = "\\b";s = "Hello World 888 1 2 & ; 0 a b c d";System.out.println(s.replaceAll(regex, "_"));regex = "\\B";System.out.println(s.replaceAll(regex, "_"));}
}

输出结果

匹配之前:
abcdefg
====================================
abcdefg
abcde_
_Hello_ _World_ _888_ _1_ _2_ & ; _0_ _a_ _b_ _c_ _d_
H_e_l_l_o W_o_r_l_d 8_8_8 1 2 _&_ _;_ 0 a b c d

量词

?:出现0次或者1次
+:出现1次或者多次
*:出现任意次
{n}:出现正好n次
{n,m}:出现n-m次
{n,}出现至少n次

/*元字符量词分类:?:出现0次或者1次+:出现1次或者多次*:出现任意次{n}:出现正好n次{n,m}:出现n-m次{n,}出现至少n次*/
public class RegularDemo7 {public static void main(String[] args) {//匹配以a开头的0次或者1次
//        String regex = "^a?";String regex = "^b?";String s = "aaaaabcdefaaaaaag";System.out.println("匹配之前:\n" + s);System.out.println("====================================");System.out.println(s.replaceAll(regex, "_"));regex = "^a+";System.out.println(s.replaceAll(regex, "_"));regex = "^b+";System.out.println(s.replaceAll(regex, "_"));regex = "^a*";System.out.println(s.replaceAll(regex, "_"));regex = "^b*";System.out.println(s.replaceAll(regex, "_"));//{n}:出现正好n次//匹配a连续出现了6次//aaaaabcdefaaaaaagregex = "a{6}";
//        s = "aaaaabcdefaaaaaag";System.out.println(s.replaceAll(regex, "_"));regex = "a{3}";System.out.println(s.replaceAll(regex, "_"));//{n,m}:出现n-m次regex = "^a{3,4}";System.out.println(s.replaceAll(regex, "_"));//{n,}出现至少n次regex = "a{6,}";System.out.println(s.replaceAll(regex, "_"));}
}

输出结果

匹配之前:
aaaaabcdefaaaaaag
====================================
_aaaaabcdefaaaaaag
_bcdefaaaaaag
aaaaabcdefaaaaaag
_bcdefaaaaaag
_aaaaabcdefaaaaaag
aaaaabcdef_g
_aabcdef__g
_abcdefaaaaaag
aaaaabcdef_g

分组: 

分组的符号为"()"

/*元字符:分组用小括号表示*/
public class RegularDemo8 {public static void main(String[] args) {//表示匹配的是ab加上n个cString regex = "abc{1,2}";String s =  "abccccABC123123baCBAabcccccABCabcabcabc123";System.out.println("匹配之前:\n" + s);System.out.println("====================================");System.out.println(s.replaceAll(regex, "_"));//表示匹配abc这个整体出现了1次到2次regex = "(abc){1,2}";System.out.println(s.replaceAll(regex, "+"));regex = "ABC(123|abc){1,}";System.out.println(s.replaceAll(regex, "+"));System.out.println(s.matches(regex)); //false}
}

输出结果:

匹配之前:
abccccABC123123baCBAabcccccABCabcabcabc123
====================================
_ccABC123123baCBA_cccABC___123
+cccABC123123baCBA+ccccABC++123
abcccc+baCBAabccccc+
false

反向引用:

/*元字符反向引用使用$引用对应组号的内容,每一个匹配的内容组号从1开始编号*/
public class RegularDemo9 {public static void main(String[] args) {//2018-04-27 ---> 04/27/2018String regex = "(\\d{4})-(\\d{2})-(\\d{2})";String str = "2018-04-27 2021-12-17";System.out.println(str.replaceAll(regex, "$2/$3/$1"));//2018-04-27 ---> 04/27/2018//分组中如果不想要生成分组编号,可以通过?:来实现regex = "(\\d{4})-(?:\\d{2})-(\\d{2})";str = "2018-04-27 2021-12-17";System.out.println(str.replaceAll(regex, "$2/$1"));}
}

输出结果:

04/27/2018 12/17/2021
27/2018 17/2021

正则表达式(以校验qq是否合法等为例)相关推荐

  1. Java基础——正则表达式_校验QQ号码、手机号是否满足规则、邮箱格式验证

    有以下案例: 1 需求:校验qq号码.要求必须是5-15位数:0不能开头:非正则表达式实现:正则表达式实现 package com.xawl.demo;import java.util.Scanner ...

  2. java qq验证_JAVA正则表达式校验qq号码的方法

    导读 正文 Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 正则表达式实例 一个字符串其 ...

  3. Java总结:正则表达式进行校验

    Java总结:正则表达式进行校验 目录 Java总结:正则表达式进行校验 一.校验数字的表达式 二.校验字符的表达式 了解理论知识,请点击:Java总结:正则表达式 一.校验数字的表达式 1 数字:^ ...

  4. java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)

    一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...

  5. 【SQLServer】验证身份证号第18位校验码是否合法

    目录 1.业务场景 2.知识前提 3.实现方案 4.测试 5.参考链接 1.业务场景 参考国家标准GB 11643-1999,居民身份证号组成:6位数字地址码+8位数字出生日期码+3位数字顺序码+1位 ...

  6. 正则表达式判断手机号码格式是否合法

    利用正则表达式判断手机号码格式是否合法 支持移动,联通,电信号码. #pragma mark 手机合法验证 +(BOOL)isMobileNumber:(NSString *)mobileNum {/ ...

  7. python中正则表达式来验证QQ号,手机号,邮箱号,身份证号

    ''' QQ的特征: 1.最少5位,最长11位 2.5位的是10001起始 3.一般以QQ:/qq:开始 ''' #先导入re模块 import re def checkQQ(str):# 正则表达式 ...

  8. python判断用户名是否合法_Python校验用户名是否合法示例

    #校验用户名是否合法例子: #输入账号密码 #input #如果账号存在提示已经注册,如果不存在的,就可以注册 all_users [] #不能为空 #strip() #用户名长度6-12之间 #le ...

  9. 请用正则表达式匹配出QQ号(假设QQ号码为5—10位);

    请用正则表达式匹配出QQ号(假设QQ号码为5-10位): 解答: ^ \d{5,10}$ 转载于:https://www.cnblogs.com/borter/p/9548333.html

  10. 常用正则表达式大全(校验数字,字符,号码等)

    一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9] ...

最新文章

  1. 三星I9000挖煤模式和R模式进入方法
  2. boost之timer,progress_timer,progress_display的介绍及使用
  3. 将 Excel 导入到 SharePoint 列表
  4. opencv 作图函数
  5. Leetcode 回溯法 典型例题
  6. 5岁儿童自学python编程-适合6-16岁孩子学习的Python编程
  7. 2018ACM-ICPC南京赛区网络赛: J. Sum(积性函数前缀和)
  8. Eclipse + keil 使用教程
  9. 反编译工具Reflector下载
  10. python艺术分形数_Python分形盒计数-分形维数
  11. 【2021】15天通过阿里云云计算架构师认证考试(ACE)- 经验分享
  12. 线上服务应急攻关方法论
  13. 计算机科学班会,计算机科学与技术学院20级13班召开“砥砺前行,“计”往开来”主题班会...
  14. Ubuntu18.04 64 位系统 安装32位支持库
  15. 给大学后端小白的一些忠告
  16. 电脑黑屏显示重新连接服务器,电脑黑屏怎么处理(电脑上显示器黑屏的处理方法)...
  17. 语音识别之HTK入门(二)
  18. 分享前端获取微信之类图标的网站
  19. 计算机主机配置单2020,2020电脑配置清单
  20. RocketMQ - nameSrv和Broker

热门文章

  1. PythonSD01个人释疑
  2. 高拍仪、浏览器获取获取多摄像头,切换摄像头
  3. springboot办公用品采购领用管理系统java
  4. 浏览器预览pdf文件名称不对,Java使用iText修改Pdf文件的标题属性,自定义预览文件名
  5. 计算机中三大总线:地址总线、数据总线、控制总线
  6. SlideLive:支持图表类PPT模板下载
  7. 三维空间点到原点距离python_如何计算三维空间中两点之间的距离?
  8. 一文搞懂三级管和场效应管驱动电路设计及使用
  9. oracle自定义异常长度,Oracle自定义异常收集(二)
  10. 如何在电脑上下载抖音视频