正则表达式

目的校验-----处理文本和匹配模式

语法:

1    常用元字符(特殊含义)

1)"\"----将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。

2)"\t"---制表符 ('\u0009')

3)"\r"---回车符 ('\u000D')

4)"\n"---换行符 ('\u000A') 注意:IO流中要写入换行符号:windows "\r\n"

预定义字符类:

5)"\d"---匹配一位数字--等价[0-9],\d在正则表达式应用的时候:[0-9]--->\\d

6)"."-----任何字符

7)"\w"--单词字符(字母、数字、下划线)等价于[a-zA-Z_0-9],而javascript中[a-zA-Z0-9]

8)"\s"--匹配任意空的(空格,制表。换行,中文全角空格)

注意字母大写(表示)

数量限定符

9)"+"----代表的是数字({1,n}),匹配前面的子表达式---(至少一次)

10)"*"----代表的是数字({0,n}),匹配前面的子表达式---任意次

11)"?"----代表的是数字({0,1}),匹配前面的子表达式(理解层面"?"就是问有没有)

边界匹配器

12)"^"-- 匹配输入字符串的开始位置 
13)"$"---匹配输入字符串的结束位置。
14)"\b"--匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的);例如---“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”

注意:对于部分元字符(无\),如果要使用其本身,必须在其前面加"\\"将其特殊含义注释掉,方能释放自我(原因:\本身也是元字符)

"[]"含义:匹配多个字符的一个

深究"[]":[abc]------a、b 、 c中的一个

[^abc]-----除了 a、b 、c的任何字符(否定)

[a-z]-------在a-z之间的任意字符

[a-d[m-p]] a 到 d 或 m 到 p---等价[a-dm-p](并集) 
            [a-z&&[def]] d、e 或 f                              (交集)

[a-z[^a]] 小写字母a的补集------------------------(补集)
            [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z]    (减去) 
            [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

"{}"含义:匹配指定数目的字符,这些字符是在它之前的表达式定义的

X{n}X,恰好 n 次 
X{n,}X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

注意:只有连字符("-")在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身。

应用场景

一个或多个汉字----------------------^[\u0391-\uFFE5]+$ 
邮政编码----------------------------^[1-9]\d{5}$
QQ号码-----------------------------^[1-9]\d{4,10}$ 
邮箱--------------------------------^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ 
用户名(字母开头 + 数字/字母/下划线)--- ^[A-Za-z][A-Za-z1-9_-]+$
手机号码----------------------------^1[3|4|5|8][0-9]\d{8}$ 
URL--------------------------------^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 
18位身份证-------------------------^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$

String类中的三个基本操作(使用正则):
1--匹配:matches()
2--切割: split()
3--替换: replaceAll()

1----public booleanmatches(String regex)
       说明:告知此字符串是否匹配给定的正则表达式
       形参:正则表达式字符串形式
       返回值类型:boolean(是否匹配)

实例1 传统做法

package org.westos.regex;import java.util.Scanner;/*** 需求:校验一个QQ号码*      定义一个规则:1)由5到10为组成的数字*                    2)不能以0开头   *   分析:*        1)键盘录入一个QQ号码,使用字符串接收*       2)定义一个校验QQ的功能*      3)在main()中调用返回boolean类型* @author Orange*/
public class RegexDemo {public static void main(String[] args) {//创建键盘录入对象Scanner sc = new Scanner(System.in) ;//录入并接收数据System.out.println("请您输入一个QQ号码:");String QQ = sc.nextLine() ;//写一个校验QQ的功能boolean flag = checkQQ(QQ) ;System.out.println("flag:"+flag);}/*** 两个明确:* 明确返回值类型:boolean类型* 参数类型:String 输入的qq号码*/public static boolean checkQQ(String qq){//假设定义个标记boolean flag = true ;//需要判断:qq:长度5-10if(qq.length()>=5 && qq.length()<=10){//符合这个规则//符合第一个规则还要符合不能以0开头if(!qq.startsWith("0")){//符合这个规则//这些QQ号码必须还数字的//可以先将qq,转换成字符数字char[] chs = qq.toCharArray() ;//遍历字符数组,获取每一个字符for(int x = 0 ; x < chs.length ; x ++){char ch = chs[x] ;//获取到每一个字符,判断该字符是否是数字if(!Character.isDigit(ch)){flag = false ;break ;}}}else{flag = false ;}}else{flag = false ;}return flag ;}
}

实例2   使用String类的matchs()方法进行匹配

package org.westos.regex;import java.util.Scanner;/*** 需求:校验一个QQ号码*      定义一个规则:1)由5到10为组成的数字*                2)不能以0开头   *   分析:*        1)键盘录入一个QQ号码,使用字符串接收*       2)定义一个校验QQ的功能*      3)在main()中调用返回boolean类型* @author Orange*/
public class RegexDemo2 {public static void main(String[] args) {//创建键盘了录入对象Scanner sc = new Scanner(System.in) ;//录入并接收数据System.out.println("请您输入QQ号码: ");String QQ = sc.nextLine() ;String regex = "[1-9][0-9]{4,9}";//正则表达式(字符串形式)/* 说明1:* public boolean matches(String regex)* 说明:告知此字符串是否匹配给定的正则表达式* 形参:正则表达式字符串形式* 返回值类型:boolean(是否匹配)* */boolean isBoolean=QQ.matches(regex);System.out.println(isBoolean);/** 说明2:* 自己封装写一个方法* */boolean flag = checkQQ(QQ) ;System.out.println("flag: "+flag);}public static boolean checkQQ(String qq){/** 分步骤:* String regex = "[1-9][0-9]{4,9}" ;* boolean flag = qq.matches(regex) ;* return flag ;***///直接返回(一步走)return qq.matches("[1-9]\\d{4,9}");}
}

练习1

package org.westos.regex_01;import java.util.Scanner;/*** 需求:校验邮箱:*      QQ邮箱:*          919081924@qq.com*          fengqingyang@163.com*          xxxxx@126.com*             zhangsan@westos.com*           lisi@sina.com*             wangwu@istone.com.cn....* 分析: 1)键盘录入邮箱*     2)定义正则规则*   3)使用String中的特有功能校验*     4)输出即可* @author Orange*/
public class RegexTest {public static void main(String[] args) {//创建键盘录入对象Scanner sc = new Scanner(System.in) ;//录入并接收System.out.println("请您输入一个邮箱:");String email = sc.nextLine() ;//定义正则规则:本身就是.-->\.--->\\.String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z]{2,3})+" ;//校验boolean flag = email.matches(regex) ;System.out.println("flag:"+flag);}
}

2-----public String[]split(String regex)

功能:根据给定正则表达式的匹配拆分此字符串(分割功能)

形参:正则表达式(字符串)

返回值类型:String[]

语法格式:要判断的字符串引用.split(正则表达式引用)

实例3

package org.westos.regex_02;import java.util.Scanner;/*** String的分割功能:* 应用场景:(搜索)*        QQ,搜索好友,相亲网:世纪佳缘...*        女  "18-24"*        String ages = "18-24" ;* @author Orange*/
public class RegexDemo {public static void main(String[] args) {//定义一个字符串String ages = "18-24" ;//定义正则规则String regex = "-" ;//public String[] split(String regex)String[] strArray = ages.split(regex) ;//如何得到当前字符串数组中的元素(字符)(转换int类型的数据)int startAge = Integer.parseInt(strArray[0]) ;int endAge = Integer.parseInt(strArray[1]) ;//键盘录入一个年龄,属于int类型的数据//创建键盘录入对象Scanner sc = new Scanner(System.in) ;//录入并接收数据System.out.println("请您输入一个年龄:");int age = sc.nextInt() ;//判断是否符我们要找的一类人if(age>=startAge && age<=endAge){System.out.println("这就是我想要的...");}else{System.out.println("不是我们要找的...");}}}

实例4

package org.westos.regex_02;
/*** 分割功能的应用:* @author Apple*/
public class RegexDemo2 {public static void main(String[] args) {//定义个字符串String str1 = "aa,bb,cc" ;//使用分割功能String[] strArray1 = str1.split(",") ;//遍历字符串数组for(int x = 0 ; x < strArray1.length; x ++){System.out.println(strArray1[x]);}System.out.println("------------------");//字符串:String str2 = "aa       bb                    cc" ;//使用切割功能:String[] strArray2 = str2.split(" +") ;for(int x = 0 ; x <strArray2.length ; x++){System.out.println(strArray2[x]);}System.out.println("--------------------");String str3 = "aa.bb.cc" ;//分割功能String[] strArray3 = str3.split("\\.") ;for(int x =0 ; x<strArray3.length ; x ++){System.out.println(strArray3[x]);}//硬盘上的路径表现形式:用两个反斜线代表一个反斜线//E:\\JavaSE\\JavaCode\\day13String str4 = "E:\\JavaSE\\JavaCode\\day13" ;//使用分割功能String[] strArray4 = str4.split("\\\\") ;for(int x = 0 ; x <strArray4.length ; x ++){System.out.println(strArray4[x]);}}
}

3----String类中的替换功能

public StringreplaceAll(String regex,String replacement)
  功能:使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串,满足此正则形式则用replacement替换

形参:参数1(正则表达式)、参数2(代替的字符串)

返回值类型:String(被和谐掉的字符串)
                语法格式:原字符串引用.replaceAll(正则表达式引用,代替的引用)

实例5

package org.westos.regex_02;
//需求:让当前这个字符串中的数字不显示出来(和谐)
public class RegexDemo3 {public static void main(String[] args) {//定义一个字符串:String str = "helloword123JavaSE45678Javaweb" ;//定义当前大串中数字定义正则规则 ;String regex = "\\d+" ;//贪婪匹配(正则表达式字符串)String s = "*" ;       //目标(目标字符串)String result = str.replaceAll(regex, s) ;System.out.println("result:"+result);}
}

regex包下的Pattern类Matcher类(很少用),相关链接:点击打开链接

实例6

package org.westos.regex_02;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 关于模式和匹配器的使用:获取功能* 模式和匹配器基本使用顺序* @author Orange*/
public class RegexDemo4 {public static void main(String[] args) {//public static Pattern compile(String regex)将给定的正则表达式编译成一个模式对象//1)获取模式对象(通过正则规则)Pattern p = Pattern.compile("a*b") ;//2)通过模式获取匹配器对象,(将一个字符串类型的数据)Matcher m = p.matcher("aaaaaab") ;//3)调用Match(匹配器类)中的:public boolean matches():判断当前用户录入的字符串是否和当前的正则规则匹配boolean flag = m.matches() ;System.out.println("flag:"+flag);System.out.println("----------------------------");//上述写法非常麻烦,要获取模式对象Pattern还要获取匹配器对象:Matcher,然后通过matches()方法返回一个结果//以后可以使用下面这种格式//定义一个正则规则String regex = "a*b" ;//指定某一个字符串String str = "aaaaaaab" ;//使用String类的功能//使用当前给定的字符串调用public boolean matchers(String regex)boolean flag2 = str.matches(regex) ;System.out.println("flag2: "+flag2);}
}

练习2

package org.westos.regex_02;import java.util.Arrays;/*** 我有如下一个字符串:"91 27 46 38 50"请写代码实现最终输出结果是:"27 38 46 50 91"分析:1)定义这个字符串2)使用分割功能分割成一个字符串数组3)如何得到一个int类型数组:动态初始化定义int数组 int[] arr = new int[字符串数数组.length] ;4)遍历int数组获取每一个元素:arr[x] = Integer.parseInt(字符串数组对象[x])5)排序:Arrays数组工具类型快速排序:sort(arr)6)再去遍历int类型数组获取每一个元素,用字符串缓冲区来进行拼接7)输出字符串* @author Apple*/
public class RegexTest {public static void main(String[] args) {//定义一个字符串String str = "91 27 46 38 50" ;//使用分割功能String[] strArray = str.split(" ") ;//定义一个int类型的数组,动态初始化int[] arr = new int[strArray.length] ;//遍历int类型的数组for(int x = 0 ; x < arr.length ; x ++){arr[x] = Integer.parseInt(strArray[x]) ;}       //parseInt()方法将数字字符串变成int型(将字符串参数作为有符号的十进制整数进行解析),很重要!!!//使用Arrays数组工具类型进行操作(sort:快速排序)Arrays.sort(arr) ;//创建StringBuilder缓冲区对象StringBuilder sb = new StringBuilder() ;//再去遍历int类型的数组,目的使用为了拼接(append)for(int x = 0 ; x < arr.length ; x ++){//使用追加功能sb.append(arr[x]).append(" ") ;}//要将字符串缓冲转换成String类型,并且去除两端空格String result = sb.toString().trim() ;System.out.println("result:"+result);}
}

相关链接:1---点击打开链接

2---点击打开链接

3---点击打开链接

4---点击打开链接---知乎

5---点击打开链接---汇总

java程序员从笨鸟到菜鸟之(二十一)正则表达式相关推荐

  1. Java程序员从笨鸟到菜鸟之(序言)+全部链接

    http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,除去前半年几乎全玩了, ...

  2. Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

     本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...

  3. Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice

    在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...

  4. Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理

    本来这第二篇打算讲解"开发第一个基于XFire的webservice"的内容来着.但是想想.开发实例只是局限于了会用的层面上.如果想真正的理解webservice还是需要挖掘其原理 ...

  5. Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)

    写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天,下午我们宿舍聚会,所以时间有点耽误,希望大家见谅 上接: Java程序员从笨鸟到菜鸟之(四)java开发常用类( ...

  6. Java程序员从笨鸟到菜鸟之(一百零六)java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.

    在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况.有时候也需要导出pdf或者CSV报表.其实原理都差不多.刚开始本来不打算也这篇博客介绍这个的.感觉这篇博客和前面的博客有点雷同.原理基本都 ...

  7. Java程序员从笨鸟到菜鸟全部博客目录

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...

  8. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

    在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...

  9. Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...

最新文章

  1. 2020 年技术趋势一览:AutoML、联邦学习、云寡头时代的终结
  2. 改进初学者的PID-采样时间
  3. 华为云新春送福,大吉大利今晚红包雨!
  4. linux pandas教程_Python Anaconda教程–了解最受欢迎的数据科学平台
  5. 《Web漏洞防护》读书笔记——第12章,CSRF跨站点请求伪造防护
  6. Oracle Goldengate Director软件截面图
  7. MOSEK Fusion Model
  8. wpf 修改输入框 光标_WPF中鼠标光标的设置
  9. ps如何把自己的图与样机结合_样机在ps里面怎么用|ps怎么把图片放在书本样机图中...
  10. 有关office2016图标显示异常的解决办法(亲测一天,终于解决!!!!)
  11. matlab 函数变量保存在工作区,Matlab中保存函数内部中间变量到工作空间的两种方法...
  12. 如何利用光驱位给老旧笔记本电脑安装固态硬盘
  13. python中怎么用format居中_python中format函数
  14. 用什么工具可以免费下载720云VR全景图
  15. java特种兵读书笔记(3-5)——java程序员的OS之OOM
  16. 信息检索 | 信息检索方法一览
  17. 【内存管理】【slab】/sys/kernel/slab/<slab name>/trace解析
  18. JVM 垃圾回收(GC)
  19. Golang Context 详细原理和使用技巧
  20. php 用count 变量,countif函数的使用方法 PHP的可变变量名的使用方法分享

热门文章

  1. 7-36 电话键盘字母数字转换
  2. 042原生的自引用方式实现多级数据渲染
  3. hive的四种文件存储格式
  4. pmp证书合理复习时间是多长?
  5. JFlow 6.0数据流引擎介绍
  6. mysql查询的长度限制_SQL查询的长度的实际限制(特别是MySQL)
  7. mysql模糊查询提速_【MySQL】Mysql模糊查询like提速优化
  8. Android登录 之 GooglePlay登录
  9. GIF动态图是怎么制作出来的?学会这几招轻松做出表情包
  10. 推荐几个上谷哥的ip