菜鸡的Java笔记 - java 正则表达式
正则表达式 RegularExpression
了解正则表达式的好处
正则表达式的基础语法
正则表达式的具体操作
content (内容)
什么事正则表达式
为了能够更加清楚的认识到正则的意义所在,下面编写一个简单的程序:判断某一个字符是否由数字组成
范例:最原始实现
package cn.mysterious.study3; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "235481";
System.out.println(isNumber(str));
}
public static boolean isNumber(String data){ char[] result = data.toCharArray(); // 变为字符数组
for (int i = 0; i < result.length; i++) {
if (result[i] < '0' || result[i] > '9') {
return false;
}
}
return true;
} }
但是以上的程序做法是可以完全简化的
package cn.mysterious.study3; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "235481";
System.out.println(str.matches("\\d+"));
} }
通过以上的代码就可以发现,正则表达式给我们用户带来最只管的感受是减少了程序的代码,实质上就属于加强了 String 的操作支持
认识正则表达式(背)
正则表达式是在 JDK.14 的时候正式追加到 java 之中的,其最早起源于 Linux 系统下
最早的java开发时代如果要想使用正则开发,那么必须区通过 apache 下载相应的正则表达式的开发包才可以完成
因为在 JDK1.4 中提供有一个新的程序包: java.util.regex ,就是正则的支持包,而且这个包中主要有两个类: Pattern, Matcher 类
其中 Pattern 类中提供有常用正则标记说明,下面来看几个常用的正则语法:(两个 \\ 表示一个 \)
1.字符( Characters 如果不加如量词,那么就表示单个字符)
a :表示由指定的字母 a 所组成
\\ :匹配“\”转义字符
\t :匹配“\t”转义字符
\n :匹配换行的转移字符
2.字符范围(如果不加如量词,那么就表示单个字符)
[abc] :表示可能是字母 a,b,c 的任意一位
[^abc] :表示不是字母 a,b,c 的任意一位
[a-zA-Z] :表示由任意一位字母(小写或大写)组成
[0-9] :表示任意一位数字所组成
3.简化表达式(如果不加如量词,那么就表示单个字符)
. :表示任意的一位字符
\d :表示任意的一位数字,等价于“ [0-9] ”;
\D :表示任意的一位非数字,等价于“ [^0-9] ”;
\w :表示任意的一位字符,有字母,数字,_ 所组成,等价于“ [a-zA-Z0-9_] ”;
\W :表示任意的一位非指定字符(不是字符,有字母,数字,_ 所组成),等价于“ [^a-zA-Z0-9_] ”;
\s :表示任意的一位空格,可能是: \n, \t;
\S :表示任意的一位非空格
4.边界匹配 (java 不要用)
^ :表示正则匹配的开始
$ :表示正则匹配的结束
5.量词描述,如果没有量词,那么每一个出现的正则度只能够匹配一个字符
表达式? :表示此正则表达式可以出现0次或1次
表达式+ :表示此正则表达式可以出现1次或多次
表达式* :表示正则表达式可以出现0次,1次或多次
表达式{n}:表示正则表达式正好出现n次
表达式{n,}:表示正则表达式正好出现n次以上,包含n次
表达式{n,m}:表示正则表达式正好出现n~m次
6.逻辑运算
X正则Y正则:表示X正则之后紧跟着验证Y正则
X正则|Y正则:表示两个正则选一个
():一组正则
String 对正则的支持 (离散数学)
如果要进行正则的操作本质上应该使用 Pattern 或 Matcher 两个类完成,但是从实际的开发来讲,大部分的开发者不会去直接使用这两个类
因为在JDK1.4之后, String 类对正则作出了支持,增加如下的诺干方法:
NO | 方法名称 | 类型 | 类型 |
1 | public boolean matches(String regex) | 普通 | 正则匹配验证 |
2 | public String replaceAll(String regex,String replacement) | 普通 | 全部替换 |
3 | public String replaceFirst(String regex,String replacement) | 普通 | 替换首个 |
4 | public String[] split(String regex) | 普通 | 拆分 |
5 | public String[] split(String regex,int limit) | 普通 | 部分拆分 |
范例:进行替换
package cn.mysterious.study3; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "sdas6da6wdsdawd@#$5%sdawds456564dawdwww235481";
String regex = "[^a-zA-Z]";
System.out.println(str.replaceAll(regex, " "));
} }
范例:进行拆分
package cn.mysterious.study3; import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "sd3a5sd65a4s6d54a6s5d5asd546as4d6as5d55555ssssssss";
String regex = "\\d+"; // "[0-9]+"
System.out.println(Arrays.toString(str.split(regex)));
} }
对于替换与拆分操作使用正则并不麻烦,最麻烦的是进行字符串的结构验证
范例:判断某一个字符穿是否是小数,如果是则将其转换为 Double 类型
package cn.mysterious.study3; import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "10.2";
String regex = "\\d+(\\.\\d+)?";
if (str.matches(regex)) {
System.out.println(Double.parseDouble(str));
}else {
System.out.println("匹配出错!");
} } }
范例:匹配日期
如果要想将字符串变为日期则一定使用 SimpleDateFormat 程序类,但是这个类需要满足特定的结构要求
package cn.mysterious.study3; import java.text.SimpleDateFormat;
import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "2019-10-10";
String regex = "\\d{4}-\\d{2}-\\d{}";
if (str.matches(regex)) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
}else {
System.out.println("匹配出错!");
} } }
范例:匹配电话号码。而这个电话号码的组成可能有如下几种:
1.4734644 \\d{7,8}
2.010-4734644 或 0104734644 (\\d{3,4}-?)\\d{7,8}
3.(010)-4734644 ((\\d{3,4}-?)|(\\(\\d{3,4}\\)-?))\\d{7,8}
package cn.mysterious.study3; import java.text.SimpleDateFormat;
import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "(010)-4734644";
String regex = "((\\d{3,4}-?)|(\\(\\d{3,4}\\)-?))\\d{7,8}";
System.out.println(str.matches(regex)); } }
正则验证 email 地址那是相当好用的
范例:验证 email 地址
简单验证:email 有字母,数字,_ 所组成
package cn.mysterious.study3; import java.text.SimpleDateFormat;
import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abc@a.c";
String regex = "\\w+@\\w+\\.\\w+";
System.out.println(str.matches(regex)); } }
完整验证:在 email 中的用户名可以由字母,数字,_ , - ,. 所组成,长度6~30位,其中要求以字母开头
同时在域名的后缀只能够是: .com, .cn, .com.cn, .net, .net.cn, .gov, .edu, .org, .me, .e
package cn.mysterious.study3; import java.text.SimpleDateFormat;
import java.util.Arrays; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "kid_187124304@feel.com";
String regex = "[a-zA-Z][a-zA-Z0-9_\\-\\.]{5,29}"
+"@[a-zA-Z0-9_\\-\\.]+\\."
+"(com|cn|com\\.cn|net|net\\.cn|gov|edu|org|me|e)";
System.out.println(str.matches(regex)); } }
对于这些正则都是属于常见操作,应该要熟练掌握
java.util.regex 包中的直接操作
实际上 String类中给出的一系列的操作,在 Pattern 和 Mathcher 类中都有支持
1. Pattern 类;
编译正则: public static Pattern compile(String regex)
字符串拆分: public String[] split(CharSequence input)
package cn.mysterious.study3; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.regex.Pattern; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "kid_187124304@feel.com";
String regex = "[^a-zA-Z]+";
Pattern pat = Pattern.compile(regex);// 编译正则
System.out.println(Arrays.toString(pat.split(str))); } }
2. Matcher 类主要是进行匹配
Matcher 类必须依靠 Pattern 类取得实例化对象: public Matcher matcher(CharSequence input)
在 Matcher 类中有如下方法:
字符串匹配: public boolean matches()
字符串替换: public String replaceAll(String replacement)
范例:匹配操作
package cn.mysterious.study3; import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegularExpression { public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "10010";
String regex = "\\d+";
Pattern pat = Pattern.compile(regex);// 编译正则
Matcher mat = pat.matcher(str);
System.out.println(mat.matches()); } }
这两个类的主要功能都在 String 中提供了支持,所以大部分情况下不会考虑使用这两个类
总结
正则表达式提供了更为强大的字符串验证与操作的功能,对于正则操作常用标记必须记熟练
虽然调用形式不同但是标准的正则支持是完全一样的
菜鸡的Java笔记 - java 正则表达式的更多相关文章
- Java 笔记 —— java 和 javac
Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...
- 菜鸡的Java笔记 - java 断言
断言:assert (了解) 所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容 范例:观察断言 public class Abnorma ...
- 菜鸡的Java笔记 - java 线程常用操作方法
线程常用操作方法 线程的命名操作,线程的休眠,线程的优先级 线程的所有操作方法几乎都在 Thread 类中定义好了 线程的命名和取得 ...
- 菜鸡的Java笔记 - java 访问控制权限
java中四种访问控制权限的使用 内容 在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...
- 菜鸡的Java笔记 - java 常用类库
CommonClassLibrary 常用类库 定时调度 定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式 con ...
- 菜鸡的Java笔记 - java 反射机制
反射机制 1.观察 Class 类的使用 2.利用反射改善工程设计模式 3.反射操作类结构 content (内容) 1. ...
- 菜鸡的Java笔记 java基础类库 BaseClassLibrary
java基础类库 BaseClassLibrary StringBuffer 类的特点 StringBuffer,StringBuilder,String 类之间的关系 ...
- 菜鸡的Java笔记 java数据库编程(JDBC)
java数据库编程(JDBC) 介绍 JDBC 的基本功能 content (内容) 现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...
- 菜鸡的Java笔记 - java 枚举
枚举 枚举属于加强版的多例设计模式 多例设计模式与枚举 多例设计模式的本质在于构造方法的私有化.而后在类的内部产生若干个实例化对象,随后利用一个 st ...
随机推荐
- 屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze
最近想做一个脚本小工具,方便写一些操作说明文档,它的功能很简单,就是把脚本打开之后,鼠标进行操作点击时,会在点击后进行截图,并在图上标记出点击的位置,有点类似于录屏软件的图片版,这样的话,如果要想用文 ...
- 四种引用类型在Springboot中的使用
今天 4ye 来和小伙伴们聊聊这个 强引用,软引用,弱引用,幻象引用(虚引用)啦 嘿嘿,主要是最近读源码的时候经常看到,然后又想到自己第一次知道这个神奇的东西是在 2020-8-21 为啥记得这么清楚 ...
- 关于布隆过滤器,手写你真的知其原理吗?让我来带你手写redis布隆过滤器。
说到布隆过滤器不得不提到,redis, redis作为现在主流的nosql数据库,备受瞩目:它的丰富的value类型,以及它的偏向计算向数据移动属性减少IO的成本问题.备受开发人员的青睐.通常我们使用 ...
- C#开发BIMFACE系列45 服务端API之创建离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToke ...
- 题解 最长道路tree
题目传送门 题目大意 给出一个\(n\)个点的树,每个点有点权,定义一条链的贡献为该链的点数乘上链上的权值和,求出树上所有链中的权值最大值. \(n\le 5\times 10^4\) 思路 算是我入 ...
- 洛谷4103 HEOI2014大工程(虚树+dp)
又是一道虚树好题啊 我们建出来虚树,然后考虑dp过程,我们分别令\(sum[x],mndis[x],mxdis[x],size[x]\)为子树内的路径长度和,最短链,最长链,子树内关键点个数. 对于一 ...
- SpringBoot-Thymeleaf模板引擎
模板引擎,我们其实大家听到很多,其实jsp就是一个模板引擎,还有用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模板引擎有非常多,但再多的模板引擎,他们的思想 ...
- Windows 10下CUDA及cuDNN的安装 —— Pytorch
Windows 10下CUDA及cuDNN的安装 CUDA简介与下载地址 CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CU ...
- C#开发BIMFACE系列48 Nginx部署并加载离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...
- 个人记录:对于python学习的反思和总结(一)
在写代码时,总是遇到写着写着不知道怎么写了的情况,或者无法把自己的想法用程序表达出来,所以有时候我们需要建立一个自己的编程思路,对一个具体程序的编程有一个比较清晰的想法:因此我把自己的思路总结了一下, ...