Java高级特性五(正则表达式)
标签: java
目录
学习笔记
通过之前一系列的分析,发现String是一个非常万能得类型,因为String不仅可以支持各种字符串操作处理,也支持向各个数据类型转换得功能,所以在项目开发之中,只要是用户输入的信息基本上都用String表示。于是在向其它类型转换的时候,为了保证转换的正确性,往往需要对其进行一些复杂的验证处理,那么在这种情况下如果之只是单纯的依靠String类中的方法是非常麻烦的。
认识正则表达式
现在假设有一个字符串,要求你判断是否由数字所组成,如果由数字所组成则将其变为数字进行乘法运算。
范例:传统做法
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "123" ;
if(isNumber(str)) {
int num = Integer.parseInt(str) ;
System.out.println(num * 2);
}
}
public static boolean isNumber(String str) {
char data [] = str.toCharArray() ;
for (char temp : data ) {
if (temp > '9' || temp < '0') {
return false ;
}
}
return true ;
}
}
实际上这种验证的功能是非常简单的,但是需要开发者编写大量的代码,那么更加复杂的验证呢?那么在这样的情况下,对于验证来讲,最好的做法是使用正则表达式。
范例:使用正则表达式实现相同功能
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "123" ;
if(str.matches("\\d+")) {
int num = Integer.parseInt(str) ;
System.out.println(num * 2);
}
}
}
正则表达式最早是从Perl语言里面发展来的,而后在JDK1.4以前如果需要使用到需要导入其他*jar文件。之后正则已经默认被JDK所支持,并且提供java.util.regex开发包,同时针对String类进行了一些修改,可以由方法直接支持正则的处理。
使用正则最大特点在于:方便进行验证处理、方便进行复杂字符串的修改处理。
常用的正则标记
如果要想进行正则操作,那么首先需要对常用的正则标记有所掌握,在java.util.regex包中提供有一个Pattern程序类,在这个类里面提供有所有支持的正则标记。
1、【数量:单个】字符匹配
- 任意字符:表示由任意字符组成;
- \\:匹配“\”
- \n:匹配换行
- \t :匹配制表符
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "a" ; // 要判断数据
String regex = "a" ; // 正则表达式
System.out.println(str.matches(regex));
}
}
2、【数量:单个】字符集(可以从里面任选一个字符)
- [abc]:表示可能是字母a、b、c中的任意一个
- [^abc]:表示不是由a、b、c中任意一个;
- [a-zA-Z]:表示由任意字母组成,不区分大小写;
- [0-9]:表示由一位数字组成;
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "1" ; // 要判断数据
String regex = "[a-zA-Z]" ; // 正则表达式
System.out.println(str.matches(regex));
}
}
3、【数量:单个】简化字符集:
- . :表示任意的一个字符
- \d:等价于“[0-9]”
- \D:等价于于“[^0-9]”
- \s:匹配任意的一位空格,可能是空格、换行、制表符
- \S:匹配任意的非空格数据;
- \w:匹配字母、数字、下划线,等价于[a-zA-Z_0-9] ;
- \W:匹配非字母、非数字、非下划线,等价于[^a-zA-Z_0-9] ;
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "1 " ; // 要判断数据
String regex = "\\D\\s" ; // 正则表达式
System.out.println(str.matches(regex));
}
}
4、边界匹配
- ^:匹配边界开始;
- $:匹配边界结束
5、数量表达,默认情况下只有添加数量单位可以匹配多位字符
- 表达式?:该正则可以出现0次或者1次;
- 表达式*:该正则表示出现0次、1次或多次 ;
- 表达式+:该正则可以出现1次或多次;
- 表达式{n}:表达式的长度正好n次;
- 表达式{n,}:表达式的长度在n次及以上
- 表达式{n,m}:表达式的长度在n~m次之间
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "adfaff" ; // 要判断数据
String regex = "\\w+" ; // 正则表达式
System.out.println(str.matches(regex));
}
}
6、逻辑表达式:可以连接多个正则
- 表达式X表达式Y:X表达式之后紧跟上Y表达式
- 表达式X | 表达式Y:有一个表达式满足即可;
- (表达):为表达式设置一个整体描述,可以为整体描述设置数量单位。
String类对正则的支持
在进行正则表达式 处理大部分情况下都会基于String类来完成,并且在String提供如下与正则有关的方法:
| No | 方法名称 | 类型 | 描述 |
| 01 |
public boolean matches(String regex) |
普通 | 将指定字符串进行正则判断 |
| 02 |
public String replaceAll(String regex, String replacement) |
普通 | 替换全部,替换为replacement |
| 03 | public String replaceFirst(String regex, String replacement) | 普通 | 替换首个 |
| 04 |
public String[] split(String regex) |
普通 | 正则拆分 |
| 05 |
public String[] split(String regex, int limit) |
普通 | 拆分为指定个数 |
下面通过一些范例来对正则的使用进行说明。
范例:实现字符串的替换(删除非字母与数字)
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "adsfasdf87690423592@$#%@^#@#%@#$adfaff" ;
String regex = "[^a-zA-Z0-9]+" ; // 正则表达式
System.out.println(str.replaceAll(regex, ""));
}
}
范例:实现字符串的拆分
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "a11b22c333333d44e55f66g" ;
String regex = "\\d+" ; // 正则表达式
// 方法一:System.out.println(str.replaceAll(regex, ""));
String result [] = str.split(regex) ;
for (String temp : result) {
System.out.print(temp + "、");
}
}
}
在进行正则处理的时候对于拆分与替换的操作相对容易些,但是比较麻烦的是数据验证部分。
范例:判断一个数据是否为小数
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "100" ;
String regex = "\\d+(\\.\\d+)?" ; // 正则表达式 //100.不是小数,100是
System.out.println(str.matches(regex));
}
}
范例:现在判断一个字符串是否由日期所组成,如果是由日期组成,将其转为Date类型
package cn.ren.demo;
import java.text.SimpleDateFormat;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "4900-12-12" ;
String regex = "\\d{4}-\\d{2}-\\d{2}" ;
if (str.matches(regex)) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
}
}
}
需要注意的是,正则表达式无法对里面的内容进行判断,只能够对对格式进行判断处理。
范例:判断给定的电话号码是否正确
- 电话号码:51273346 \\d{7,8}、01051273346 \\d{3,4}\\d{7,8}、(010)-51273346 \\(\\d{3,4}\\)-\\d{7,8}
package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "(010)-51273346" ;
String regex = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}" ;
System.out.println(str.matches(regex));
}
}
既然已经可以使用正则进行验证了,那么下面就可以利用其来实现一个email地址格式的验证。
范例:验证email格式
- email的用户名可以由字母、数字、_组成,不能用下划线开头
- email的域名可以由字母、数字、_、-所组成
- 域名的后缀必须是:.cn、.com、.com.cn、. gov

package cn.ren.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "[email protected]" ;
String regex = "[a-zA-Z0-9]\\w+@\\w+\\.(cn|com.cn|gov)" ;
System.out.println(str.matches(regex));
}
}
现在这几种的正则的匹配操作是最常用的几种处理形式。
java.util.regex包
虽然在大部分情况下,利用String类实现正则的操作,但是也有一些情况下需要使用到java.util.regex包中的正则处理类。在这个包里面一共定义有两个类:Pattern(正则表达式编译类)、Matcher(正则匹配)。
1、Pattern类提供有正则表达式的编译处理支持:public static Pattern compile(String regex)
同时也提供有字符串的拆分支持:public String[] split(CharSequence input)
package cn.ren.demo;
import java.util.regex.Pattern;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "fdajfla34mf!@#dsaf435b#@3fdsf@#%" ;
String regex = "[^a-zA-Z]+" ;
Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
String result [] = pat.split(str) ;
for (String temp : result ) {
System.out.print(temp + "、");
}
}
}
2、Matcher类,实现了正则匹配的处理类,这个类的对象实例化依靠Pattern类完成,Matcher中构造方法私有化了
- Pattern类提供的方法:public Matcher matcher(CharSequence input)
当获取了Matcher类的对象之后就可以利用该类中的方法进行如下操作:
范例:字符串匹配
package cn.ren.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String str = "101" ;
String regex = "\\d+" ;
Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
Matcher mat = pat.matcher(str) ;
System.out.println(mat.matches());
}
}
如果以拆分、替换、匹配三种操作为例,根本用不到java.util.regex开发包,只用String类中的方法就足够了。但是Matcher类里面提供有一种分组的功能,而这种功能是String不具备的。
package cn.ren.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
// 要求取出这个标记#{}中的所有内容
String str = "INSERT INTO dept(deptno,dname,loc)VALUES(#{deptno},#{dname},#{loc})" ;
String regex = "#\\{\\w+\\}" ;
Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
Matcher mat = pat.matcher(str) ;
while (mat.find()) { // 是否有匹配成功的内容
System.out.println(mat.group(0).replaceAll("#|\\{|\\}", ""));
}
}
}
java.util.regex开发包,如果不是进行一些更为复杂的正则处理是很难使用到的,而String类所提供的功能只适合于正则的基本操作。
智能推荐
java正则表达式
今天开发过程遇到了正则表达式 虽然以前学过 但习惯了百度 早已忘了 这次重新捡起来 随便写几个练下手。 推荐一个java正则表达式的网址 菜鸟教程 http://www.runoob.com/java/java-regular-expressions.html 正则表达式还可以用来替换字符串: 例如:替换手机号码中四位为* mobile.replaceAll(“(\d{3})\d{4}...
Java正则表达式详解
1、正则表达式 在开发中,通常很多数据都会使用String类存储。原因:操作字符串的功能比较多,比较方便。 在操作String类对象时,会经常遇到对字符串进行验证的功能,而按照我们之前学习的String类,我们使用String类中的诸多函数是可以完成对字符串校验功能的,但是代码相对来说比较麻烦,所以在Java中引入正则表达式的概念来解决上述问题,即简化代码。 正则表达式:专门用于操作字符串的技术,...
Java正则表达式总结
引言 正则表达式(英文:regular expression)是用于描述字符串规则的工具,是记录文本规则的代码。 它可以用来搜索、编辑、处理文本。现有编程语言都支持正则表达式的处理,但每种语言都有细微的差别。 在Java 中,正则表达式的转义反斜杠要用:\\ 来表示,这是因为在《Java Language Specification》中明确规定,Java 中的一个反斜杠会用于转义Unicode编码...
Java正则表达式基础
先看一下正则表达式的一些基本符号及用法: . 表示任意一个字符 [asd] 表示a或s或d [^asd] 除了asd之外的 [a-z] 所有小写字母 [A-Z] 所有大写字母 \d 任意的数字 \D 非数字 \w [A~Z a~z 0~9]...
java之正则表达式
序言 正则表达式:字符串处理神器 正则表达式是处理字符串的强大的工具,它不是Java的特性,前端的JavaScript等也有。但是相比于其他老牌的高级语言,如C/C++,这是Java比他们独特的地方。 正则表达式用途: 1). 字符串匹配 2). 字符串查找 3). 字符串替换 在正则表达式正式出场之前,我们先从熟悉的String类两个方法开始。 这是String类自带的方法,方法里面的参数是一个...
猜你喜欢
java正则表达式
正则表达式简介 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符...
Java正则表达式详解
Java 提供了功能强大的正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。 正则表达式 一个正则表达式是一个用于文本搜索的文本模式。换句话说,在文本中搜索出现的模式。例如,你可以用正则表达式搜索网页中的邮箱地址或超链接。 正则表达式示例 下面是一个简单的Java正则表达式的例子,用于在文本中搜索 http:// 示例代码实际上没有检测找到的 http:...
java(六)正则表达式
。。。。大数据工程师必备技能图谱 Hadoop 家族技能图谱 正则表达式: 其实一种规则,有自己特殊的应用,其作用就是针对于字符串进行操作。 正则: 就是用于操作字符串的规则,其中这些规则使用了一些字符表示。 1. 正则表达式符号 1.1 预定义字符类 (任何预定字符没有加入数量词之前只能匹配一个字符) 1.2 Greedy ...
Linux环境下配置和安装hadoop及hadoop集群搭建(VMware)
文章目录 一、安装准备 二、hadoop的配置 1.首先配置hadoop-env.sh 2.配置core-site.xml 3.配置hdfs-site.xml 4.配置mapred-site.xml 5.配置yarn-site.xml 6.配置slaves 7.配置hadoop环境变量 三、格式化HDFS 四、启动hadoop 五、集群搭建 1.克隆虚拟机 2.配置免密登录 3.修改主机器的配置文...
使用QProcess打开和关闭第三方应用,比如CMD
使用QProcess打开和关闭第三方应用,比如CMD 注意: 很多教程不一定是对的,但我这篇绝对是对的,因为我踩坑过啊。 为了节省时间,直接上图、上代码,so easy! 重要事情说3遍: 杀死进程,一定要加/F 和 /T 杀死进程,一定要加/F 和 /T 杀死进程,一定要加/F 和 /T 开始 验证下,打开任务管理器就能看到 总结 从上面看,是不是很简单,taskkill不知道是啥,是windo...
