目录

案例一:获取文本中的数字,字母,中文,并分别打印出来

案例一的相关知识概述:

元字符

字符匹配符

限定符

贪婪匹配

选择匹配符

定位符

起始和结束字符的应用:验证qq邮箱是否正确

字母查找不区分大小写

使用 (?i)大小写不敏感

在创建pattern时指定大小写不敏感

分组及捕获

常用分组(捕获匹配)

未经过分组

使用(pattern)分组

使用(?patter)分组

特别分组(非捕获匹配)

(?:pattern)

(?=pattern)

(?!pattern)

反向引用

反向引用综合案例---文本去重

验证IP地址是否正确(合法)


在java中,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个“规则字符”,这个“规则字符”用来表达对字符串的一种过滤逻辑。光看概念可能感受不怎么深,接下来我们使用代码来看看正则表达式究竟能干什么:

案例一:获取文本中的数字,字母,中文,并分别打印出来

文本:

尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日-),生于瑞士温特图尔,是瑞士计算机科学家。少年时代的Niklaus Wirth与数学家Pascal一样喜欢动手动脑。1958年,Niklaus从苏黎世工学院取得学士学位后来到加拿大的莱维大学深造,之后进入美国加州大学伯克利分校获得博士学位。

凭借一句话获得图灵奖的Pascal之父--Nicklaus Wirth,让他获得图灵奖的这句话就是他提出的著名公式:"算法+数据结构=程序"。

这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的"E=MC^2"--一个公式展示出了程序的本质。

如果觉得上面的代码过于冗杂,我们可以创建一个方法用于获取相应子字符串。

import java.util.regex.*;public class GetAlnumChinese {public static void main(String[] args) {String str="尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日-)生于瑞士温特图尔,是瑞士计算机科学家。"+ "少年时代的Niklaus Wirth与数学家Pascal一样喜欢动手动脑。"+ "1958年,Niklaus从苏黎世工学院取得学士学位后来到加拿大的莱维大学深造,"+ "之后进入美国加州大学伯克利分校获得博士学位。"  +"凭借一句话获得图灵奖的Pascal之父--Nicklaus Wirth,"+ "让他获得图灵奖的这句话就是他提出的著名公式:\"算法+数据结构=程序\"。" +"这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的'E=MC^2'--"+ "一个公式展示出了程序的本质。";GetContent("数字","[0-9]+",str);GetContent("字母","[a-zA-Z]+",str);GetContent("中文","[\u0391-\uffe5]+",str);}public  static void GetContent(String name,String regExp,String str) {System.out.println();Pattern pattern=Pattern.compile(regExp);Matcher matcher=pattern.matcher(str);System.out.printf("获取到的%s为:",name);while(matcher.find()) {System.out.print(matcher.group(0)+"  ");}}}

案例一的相关知识概述:

从上面代码的实现我们可以很明显的看出,正则表达式对于处理文本内容(即字符串类型的数据)来说是极其有用的。我们在使用正则表达式来从字符串中获取我们需要的内容前,一般都需要做如下三个准备:

  1. 先使用Pattern类创建模式(样式)对象,也叫正则表达式对象,该类是没有公共的构造方法的,因此不能使用new关键字来进行实例化类产生对象,但我们依旧可以通过它的方法compile()来编译我们的正则表达式,使之成为字符串进行匹配的模板对象。接着我们再使用Matcher类创建匹配器,这个匹配器会按照我们创建好的pattern(模式)对象到我们的字符串文本中去匹配符合条件的子字符串。
  2. 接着使用匹配器下的find()---该方法返回的数据类型是boolean型,find()查找是否有符合条件的子字符串,如果找到了就会返回true,否则就返回false。
  3. 最后我们可以使用while循环来进行判断,如果是true,我们则将存储到group(0)中的子字符串(匹配的内容)打印出来。

元字符

Java中的正则表达式支持的元字符:( )  [ ]  { }   \  ^  $  |  ?  *  +  .  < >  -  =  !(不需要刻意的去记有多少种,只要这类的代码打多了,就知道与这些元字符相关的使用了)

字符匹配符

纸上得来终觉浅,绝知此事要躬行。---陆游

我们使用代码来进行展示,相关的注释也放在了代码段里面。

结果如下所示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class YuanChar {public static void main(String[] args) {String inputStr="尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日-),生于瑞士温特图尔,是瑞士计算机科学家.";GetContent("任意一个字符",".",inputStr);              //将字符串里面的内容全部打印出来GetContent("0-9之间的任何一个数字","\\d",inputStr);    //[0-9]与之实现效果一样GetContent("任何一个非数字","\\D",inputStr);             //[^0-9]与之实现效果一样GetContent("空白字符","\\s",inputStr);GetContent("非空白字符","\\S",inputStr);              //基本上非××的都是将原来的转义字符给大写即可GetContent("可标识的字符","\\w",inputStr);GetContent("大写字母","\\p{Upper}",inputStr);GetContent("小写字母","\\p{Lower}",inputStr);GetContent("ASCII字符","\\p{ASCII}",inputStr);GetContent("字母字符","\\p{Alpha}",inputStr);         //类似于[a-zA-Z]GetContent("中文字符","[\u0391-\uffe5]",inputStr);GetContent("数字或字母","\\p{Alnum}",inputStr);GetContent("标点字符","\\p{Punct}",inputStr);          //只能获取到英文半角格式的标点符号GetContent("十进制数","\\p{Digit}",inputStr);         //类似于"\\d"或者是[0-9]GetContent("可见字符","\\p{Graph}",inputStr);        //可见就是数字字母标点符号GetContent("空格或制表符","\\p{Blank}",inputStr);GetContent("非空白字符","\\p{Cntrl}",inputStr);}public  static void GetContent(String name,String regExp,String inputStr) {System.out.println();Pattern pattern=Pattern.compile(regExp);Matcher matcher=pattern.matcher(inputStr);System.out.printf("使用\"%s\"匹配到的是%s如:%n",regExp,name);while(matcher.find()) {System.out.print(matcher.group(0)+" ");}
}}

限定符

如上面的字符匹配符"\\d"从全文中匹配到单个的数字时就会将结果打印出来,如果我们想要的是将连在一起的数字打印出来那又该怎么做呢?这里就不得不说一下限定符了,java中的限定符有如下几个---我们均使用代码来进行展示,这样子会更加直观,在看这些知识的时候就不会那么枯燥:

贪婪匹配

如上我们可以看到,虽然我们的限定符的有最小的范围值,但是它都是尽可能匹配多的数据(即匹配最大的范围值),因此java匹配也叫贪婪匹配。如果我们想要忽略这个贪婪匹配,让它取到我们区间里面最小的那个范围值的话,我们可以在限定符的后面使用“?”---当此字符紧随任何其他限定符如上的?*+{n,}{n,m}之后时,匹配模式是“非贪心的”。该模式匹配搜索到的为尽可能短的字符串,如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class YuantChar {public static void main(String[] args) {String inputStr="尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日-),生于瑞士温特图尔,是瑞士计算机科学家."; GetContent("+?","一次","0-9之间的数字","\\d+?",inputStr);   //同[0-9]+,如果数字后面还有数字就会连在一起打印GetContent("*?","0次 ","0-9之间的连续数字","\\d*?",inputStr);    //可以没有数字GetContent("??","0次 ","0-9之间的连续数字","\\d??",inputStr);    //可以没有数字GetContent("{n}","刚刚好出现n次","0-9之间的连续数字","\\d{2}?",inputStr);GetContent("{n,}?","出现n次","0-9之间的连续数字","\\d{2,}?",inputStr);GetContent("{n,m}?","n次","0-9之间的连续数字","\\d{2,4}?",inputStr);}public  static void GetContent(String sign,String des,String name,String regExp,String inputStr) {System.out.println();System.out.printf("加上%s代表该字符出现的次数:%s→",sign,des);Pattern pattern=Pattern.compile(regExp);Matcher matcher=pattern.matcher(inputStr);System.out.printf("使用\"%s\"匹配到的是%s如:",regExp,name);while(matcher.find()) {System.out.print(matcher.group(0)+" ");}}}

选择匹配符

接下来我我们使用选择匹配符(|)来将字符串里面JDK1.3,JDK1.4的都替换成JDK

定位符

在这里我们就讲解四个比较常见的

  1. 起始字符(^):在正则表达式中表示以当前指定的字符(字符串)格式开头。
  2. 结束字符($):在正则表达式中表示以指定的字符(字符串)格式结尾

起始和结束字符的应用:验证qq邮箱是否正确

import java.util.Scanner;
import java.util.regex.*;
public class Location {public static void main(String[] args) {
//      验证qq邮箱是否正确Scanner sc=new Scanner(System.in);System.out.print("请输入您的邮箱地址:");String scInput=sc.nextLine();String regStr="^(\\p{Digit})+[@]\\p{Alpha}+\\p{Punct}?\\p{Lower}+$";String out=(scInput.matches(regStr))?"您的输入格式正确":"您的输入格式不正确";System.out.println(out);}
}

字母查找不区分大小写

java中正则表达式默认是区分大小写的,但是我们可以使用问号和i的组合(?i)实现不区分大小写---i表示不敏感,是insensitive的缩写:如果我们想要哪个字符(哪些字符串)不区分大小写,就将(?i)放置到该内容的前面即可或者是在创建pattern对象时在里面指定大小写不敏感,如:

大小写敏感:

使用 (?i)大小写不敏感

在创建pattern时指定大小写不敏感

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class UpperAndLower {public static void main(String[] args) {String str="abcABCEFFSDABCd";
//      String regStr="(?i)(abc)";  //查找abc字符串String regStr="(abc)";Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);Matcher matcher=pattern.matcher(str);while(matcher.find()) {System.out.println("找到:"+matcher.group(0));}}}

分组及捕获

我们可以使用圆括号组成一个比较复杂的匹配模式(那么一个圆括号的部分我们可以看作是一个子表达式或者是一个分组),分组有常用分组和特殊分组。我们先来认识常用分组:常用分组使用的基本上是捕获匹配---即存储以后使用的匹配。常用分组的构造形式为:

  1. (pattern)---非命名捕获(依旧是个捕获匹配)。捕获匹配的字符串编号为零的第一个捕获是由整个正则表达式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号。
  2. (?<name>patter)---命名捕获。将匹配的子字符串捕获到一个组名或编号名称中,用于name的字符串不能包含任何标点符号,且不能以数字开头---和变量名(标识符)的声明类似

常用分组(捕获匹配)

未经过分组

使用(pattern)分组

使用(?<name>patter)分组

如上,使用了命名捕获,我们就使用它的组名来进行打印输出。

特别分组(非捕获匹配)

特别分组里面基本上是非捕获匹配---不存储以后使用的匹配。

(?:pattern)

这个一般对于用“or”或(|)字符组合模式部件的情况很有用。

(?=pattern)

匹配的内容是与某个字符串或者是多个字符串相连的数据,如下:只会匹配与‘联邦洛桑’或者是与‘联邦学院’相连的‘瑞士’数据,因此,即使字符串文本里面 有很多的‘瑞士’数据,但是只会打印输出两条。

(?!pattern)

与(?=pattern)刚好相反,查找的是不与之相连的子字符串。

import java.util.regex.*;public class NoGet {public static void main(String[] args) {String str="洛桑联邦理工学院(法文:École Polytechnique Fédérale de Lausanne, 简称:EPFL),"+ "又称瑞士联邦理工(洛桑),位于瑞士联邦洛桑,最初可以追溯到1853年建立的私立学校,"+ "后正式成立于1969年, 与姊妹校苏黎世联邦理工学院一起组成瑞士联邦理工学院,";//找出“洛桑联邦理工学院”“苏黎世联邦理工学院”“瑞士联邦理工学院”
//    String regStr="(?:洛桑|苏黎世)联邦理工学院";
//    String regStr="瑞士(?=联邦洛桑|联邦理工学院)";String regStr="瑞士(?!联邦洛桑|联邦理工学院)";Pattern pattern=Pattern.compile(regStr);Matcher matcher=pattern.matcher(str);while(matcher.find()) {System.out.println("捕获到:"+matcher.group(0));}}
}

反向引用

圆括号的内容被捕获后,可以在这个括号后使用\\(分组号)从而写出比较实用的匹配模式,这个我们称为反向引用,这个引用既可以是正则表达式内部,也可以是在正则表达式外部,内部反向引用使用\\分组号外部使用反向引用使用$分组号。【反向引用一半呢用来找相同的数字

1,匹配两个连续相同的数字

2,匹配五个连续相同的数字

3,搜索:满足前面是一个五位数,然后一个连字符“-”,之后是一个九位数(连续的每三位相同)例:12345-111222333

import java.util.regex.*;
public class FanXiang {public static void main(String[] args) {
//      String str="22333444455555";
//      GetFanXiang("两","(\\d)\\1",str);
//      GetFanXiang("五","(\\d)\\1{4}",str);  //{4}代表了反向引用四次,即我们的数字出现了1+4共五次String des="满足前面是一个五位数,然后一个连字符“-”,之后是一个九位数(连续的每三位相同)";String regStr="\\d{5}[-](\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";String str="张三的号码:12345-111222333,对吗";  //获取如:12345-111222333GetFanXiang(des,regStr,str);}public static void GetFanXiang(String des,String regStr,String str) {System.out.println();Pattern pattern=Pattern.compile(regStr);Matcher matcher=pattern.matcher(str);while(matcher.find()) {System.out.printf("获取%s位数使用的是%s→结果为:%s%n",des,regStr,matcher.group(0));}}}

反向引用综合案例---文本去重

例如我们有一个字符串:"快.......快....快来一...一起...学..学..java!"。

大家读起来是不是感觉很不好,接下来让我们来将它修改成这样→“快来一起学java!

首先,看到那么多个小点点,很不舒服,我们先将它们去除掉,可以先使用正则表达式匹配出所有的点,然后使用字符串里面的替换方法replaceAll(),将所有的点替换成空字符“”。

接着我们去将出现了两次及两次以上的数字进行替换成它本身。使用之前学习的正则表达式反向引用里面的“\\分组号”,进行匹配重复的字符。最后我们在外部进行反向引用“$分组号”。

如上就完成了文本的去重了。

验证IP地址是否正确(合法)

形如:10.0.0.0--10.255.255.255或者是115.239.174.206的我们称之为ip地址。分析左边的两个ip地址的形式,我们可以看到ip地址后面可以不接--数字.数字.数字的,因此后面的可以为0也可以有一个,就用到了我们前面提到的限定符“?”---表示该数据出现0次或是1次。

正则表达式的元字符有很多种,可以选择自己喜欢的表达来进行编写正则表达式,不一定要像上面那样,我们的正则表达式也可以换成"([0-9]+\\.)+[0-9]+([-]{2}([0-9]+\\.)+[0-9]+)?"

import java.util.Scanner;public class IP {public static void main(String[] args) {//判断输入的ip地址是否合法。如:10.0.0.0--10.255.255.255或者是115.239.174.206Scanner sc=new Scanner(System.in);System.out.print("请输入您的ip地址:");String scInput=sc.nextLine();
//      String regStr="(\\p{Digit}+\\.)+\\p{Digit}+([-]{2}(\\p{Digit}+\\.)+\\p{Digit}+)?";String regStr="([0-9]+\\.)+[0-9]+([-]{2}([0-9]+\\.)+[0-9]+)?";String out=(scInput.matches(regStr))?"您的输入合法":"您的输入不合法";System.out.println(out);}
}

Day011--java中的正则表达式(Regular Expression)相关推荐

  1. Java中的正则表达式 regex

    常用类解析:正则表达式 regex 前言 一.正则表达式 二.匹配规则 三.匹配任意字符 四.匹配数字 五.匹配常用字符 六.匹配空格字符 七.匹配非数字 八.重复匹配 九.正则表达式小总结 十.匹配 ...

  2. 初步了解并使用正则表达式 (REGular EXPression)

    正则表达式(REGular EXPression),正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本.只有掌 ...

  3. java js 正则表达式_如何在JavaScript与Java中使用正则表达式

    如何在JavaScript与Java中使用正则表达式 发布时间:2021-02-11 13:16:01 来源:亿速云 阅读:69 作者:Leah 如何在JavaScript与Java中使用正则表达式? ...

  4. Java中的正则表达式 - Java Regex示例

    Java中的正则表达式 - Java Regex示例 欢迎使用Java中的正则表达式.它在Java中也称为Regex.当我开始编程时,java正则表达式对我来说是一场噩梦.本教程旨在帮助您掌握Java ...

  5. java 中的正则表达式_Java中的正则表达式–软介绍

    java 中的正则表达式 正则表达式是一种可以应用于文本(Java中的String)的模式. Java提供了java.util.regex包,用于与正则表达式进行模式匹配. Java正则表达式与Per ...

  6. java正则表达式性能_译:Java 中的正则表达式性能概述

    译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模式匹配引擎是如何工作的.我们还将介绍在 Java 中优化正则表达式的不同方式. 有关正则表达式的的使用介绍,请参阅此文. 2. 模式 ...

  7. 详解Java中的正则表达式

    详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 {p ...

  8. java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断

    怎么在java中利用正则表达式对时间日期进行判断 发布时间:2020-12-08 16:18:34 来源:亿速云 阅读:105 作者:Leah 这篇文章给大家介绍怎么在java中利用正则表达式对时间日 ...

  9. java中,正则表达式的使用 (最普通使用,Group,贪婪模式)

    目录 0.最普通的使用 1.正则表达式有Group功能. 2.正则表达式中的贪婪模式, 非贪婪模式(*?) 3.find() 与 matches() 之间的区别 ↓循环获取所有文件 ↓文件内部内容读取 ...

  10. java中的正则表达式类---表情转换实例

    Java中的正则表达式类 ________________________________________ public interface MatchResult 匹配操作的结果. 此接口包含用于确 ...

最新文章

  1. 隔行如隔山 -- 乱弹技术,经济,对日外包
  2. LINQ TO SQL中还是用传统的连接串方式建立DbContext更好些
  3. 一张图片教你识别Vue的premission的权限管理,您细品\(^o^)/~
  4. 将10进制整数转换成16进制整数输出
  5. Transaction 那点事儿,Spring事务管理
  6. Python 字符串 String 内建函数大全(1)
  7. Oracle数据库迁移测试数据,Oracle数据库的数据迁移方法
  8. txt doc rtf html,JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例.docx
  9. object.__new__
  10. JDK源码学习笔记——String
  11. 地铁票务管理系统_地铁票务管理工作总结
  12. kafkaStream执行过程中出现TimeoutException异常退出
  13. Java之棋牌游戏——编写一个斗地主洗牌发牌的程序,要求按照斗地主的规则完成洗牌发牌的过程
  14. 柯美6501服务器系统,柯美6501维修手册全-(1).pdf
  15. centos 下 docker 的 安装与使用 (一)
  16. CodeForces - 985A Chess Placing(水)
  17. Postgresql 之 数据库认证
  18. bitcoin(1)
  19. 解决active样式在ios手机上没有生效的问题
  20. java word 题目导入_java使用poi导入word题库

热门文章

  1. 高中生计算机类特长怎么写,高中生学籍档案个人特长怎么写
  2. 深度学习并未走进死胡同
  3. 2021年全球半导体分立器件市场规模大约为1898亿元,预计2028年将达到3255亿元
  4. python量化交易入门教程_Python期货量化交易基础教程(9)
  5. android 传感器源码分析,Android 重力传感器源码实例+注释
  6. 什么是Cmake和Makefile?
  7. 802.11R无线交互
  8. 用python画小黄人步骤图-通过python将图片生成字符画
  9. python pow函数——幂运算 快速幂算法实现思路
  10. 快速排序的按区间的三个版本及优化--友友们不一定了解