正则表达式

通过之前一系列的分析可以发现,String是一个非常万能的类型,因为String不仅仅可以支持有各种字符串的处理操作,也支持有向各个数据类型的转换功能,所以在项目的开发之中,只要用户输入的信息基本上都用String表示。于是在向其他数据类型转换的时候,为了保证转换的正确性,往往需要对其进行一些复杂的验证处理。

1,认识正则表达式

  现在假设有一个字符串要求先判断字符串是否有数字组成,如果由数字所组成则将其变为数字进行乘法计算。

 public class Main {
public static void main(String[] args) {
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(int x=0;x<data.length;x++){
if(data[x]>'9' || data[x]<'0'){
return false;
}
}
return true;
}
}

  ·范例:使用正则表达式来实现同样的效果  实际上这种验证的功能是非常简单的,但是如此简单的功能却需要开发者编写大量的程序逻辑代码,如果是更加复杂的验证呢?那么在这样的情况下,对于验证来讲最好的做法就是利用正则表达式来完成。

 public class Main {
public static void main(String[] args) {
String str="123";
if(str.matches("\\d+")){
int num= Integer.parseInt(str);
System.out.println(num*2);
}
}
}

  使用正则最大的特点在于方便进行验证处理,以及方便进行复杂字符串的修改处理。(代码生成器中的代码自动匹配补全就是使用的正则)  正则表达式最早是从Perl语言里面发展而来的,而后在JDK1.4以前如果要使用到正则表达式的相关定义则需要单独引入相关的【*.jar】文件,但是从JDK1.4之后,正则已经默认被JDK所支持,并且提供有一个java.util.regex开发包,同时针对于String类也进行了一些修改,使其可以有方法直接支持正则处理。

2,常用正则标记

  如果要想进行正则的处理操作,那么就首先需要对常用的正则标记有所掌握,从JDK1.4开始提供有一个java.util.regex开发包,这个包里面有一个Pattern程序类,在这个程序类里面定义了有所有支持的正则标记。

正则符号

功能

例子

1,【数量:单个】字符匹配

任意字符

表示由任意字符组成

"ab".matches("ab")=true

\\

匹配【\】

 

\n

匹配【换行】

 

\t

匹配【制表】

 

2,【数量:单个】字符集(可以从里面任选一个字符)

[abc]

表示可能是a、b、c中任意的一个

 

[^abc]

表示不是由字母a、b、c中任意一个

 

[a-zA-Z]

表示由任意一个字母所组成,不区分大小写

 

[0-9]

表示由一位数字所组成

 

3,【数量:单个】简化字符集

.

表示任意的一个字符

 

\d

等价于[0-9]范围

 

\D

等价于[^0-9]范围

 

\s

匹配任意的一位空格,可能是空格、换行、制表符

 

\S

匹配任意的非空格

 

\w

匹配字母、数字、下划线,等价于[a-zA-Z_0-9]

 

\W

匹配非字母、数字、下划线,等价于[^a-zA-Z_0-9]

 

4,边界匹配

^

匹配边界开始

 

$

匹配边界结束

 

5,数量表示:默认情况下只有添加数量单位才可以匹配多位字符

表达式?

该正则可以出现0次或1次

 

表达式*

该正则可以出现0次、1次或多次

 

表达式+

该正则可以出现1次或多次

 

表达式{n}

表达式的长度正好为n次

 

表达式{n,}

表达式的长度正好为n次以上

 

表达式{n,m}

表达式的长度正好为n~m次

 

6逻辑表达式:可以连接多个正则

表达式X表达式Y

X表达式之后紧跟上Y表达式

 

表达式X|表达式Y

有一个表达式满足即可

 

(表达式)

为表达式设置一个整体描述。可以设置数量单位

 

3,String类对正则表达式的支持

  在进行正则表达式大部分处理的情况下都会基于String类来完成,并且在String类里面提供有如下与正则有关的操作方法。

No.

方法描述

类型

描述

01

public boolean matches(String regex)

普通

将指定字符串进行正则判断

02

public String replaceAll

(String regex,String replacement)

普通

替换全部

03

public String replaceFirst

(String regex,String replacement)

普通

替换首个

04

public String[] split(String regex)

普通

正则拆分

05

public String[] split

(String regex,int limit)

普通

正则拆分成特定个数

  下面通过具体的范例来对正则的使用进行说明。

  ·范例:实现字符串的替换(删除掉非字母与数字)

 public class Main {
public static void main(String[] args) {
String str="ajfsdf45345as74fe.;'dsaf1231sadfeqw4";
String regex="[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex,""));
}
}

·范例:实现字符串的拆分

 public class Main {
public static void main(String[] args) {
String str="ajfsdf45345as74fe.;'dsaf1231sadfeqw4";
String regex="\\d+";
String[] result=str.split(regex);
for(int i=0;i<result.length;i++){
System.out.print(result[i]+"、");
}
}
}

  ·范例:判断一个数据是否为小数,如果是小数则将其变为double类型  在正则处理的时候对于拆分与替换的操作相对容易一些,但是比较麻烦的是数据验证的部分。

 public class Main {
public static void main(String[] args) {
String str="100.1";
String regex="\\d+(\\.\\d+)?";
System.out.print(str.matches(regex));
}
}

  ·范例:现在判断一个字符串是否由日期所组成,如果是由日期组成则将其转为Date类型

 import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception{
String str="1991-06-06";
String regex="\\d{4}-\\d{2}-\\d{2}";
if(str.matches(regex)){
Date dateFormat=new SimpleDateFormat(("yyyy-MM-dd")).parse(str);
System.out.println(dateFormat);
System.out.println(new SimpleDateFormat(("yyyy-MM-dd")).parse(str));
//使用1次变成垃圾(匿名对象)
}
}
}

  ·范例:判断给定的电话号码是否正确  需要注意的是,正则表达式无法对里面的内容进行判断,只能对格式进行判断处理。

    ①电话号码:51283346、"\\d{7,8}"
    ②电话号码:01051283346、"(\\d{3,4})?\\d{7,8}"
    ③电话号码:(010)-51283346、"((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}"

 public class Main {
public static void main(String[] args) throws Exception{
String str1="51283346";
String str2="01051283346";
String str3="(010)-51283346";
String regex="((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";
System.out.println(str3.matches(regex));
}
}

  ·范例:验证email格式  既然可以使用正则进行验证了,那么下面就可以利用其来实现一个email地址格式的验证。

  email的用户名可以由字母、数字、_所组成。

 public class Main {
public static void main(String[] args) throws Exception{
String str1="wanyu@mufasa.site";
String str2="mldnjava888@mldn.cn";
String str3="10001@qq.com"; String regex="[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|net|gov|site)";
System.out.println(str3.matches(regex));
}
}
/**
* email的用户名可以由字母、数字、_、-所组成(不能使用下划线开头);
* email的域名可以由字母、数字、_、-所组成;
* 域名的后缀必须是.cn、.com、.net、.com.cn、.gov;
* 现在已经有其他域名开放了
* deom1: wanyu@mufasa.site
* demo2: mldnjava888@mldn.abc
* demo3: 10001@qq.com
* [a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|net|gov)
*/

4,java.util.regex包支持  现在这几种正则的匹配处理操作是最常见的几种处理形式。

  虽然在大部分的情况下都可以利用String类实现正则的操作,但是也有一些情况下需要使用java.util.regex开发包中提供的正则处理类,在这个包里面一共定义有两个类:Pattern(正则表达式编译)、Matcher(匹配)。

  ①Pattern类提供有正则表达式的编译处理支持:public static Pattern compile(String regex)

  也提供有字符串的拆分操作:public String[] split(CharSequence input)

 import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws Exception{
String str="dasjk\nlfds454\t3d sa4fasfas5f46d78.cs.;','zxv'sdf1a3dsf5";
String regex="[^a-zA-Z0-9]+";
Pattern pattern=Pattern.compile(regex);
String[] result=pattern.split(str);
for(int i=0;i<result.length;i++){
System.out.print(result[i]+"、");
}
}
}//字符串的拆分是最简单的

  public Matcher matcher(CharSequence input)当获取Matcher类的对象之后就可以利用该类中的方法进行如下操作:  ②Matcher类,实现了正则匹配的处理类,这个类的对象实例化依靠Pattern类完成

    ·正则匹配:public boolean matches()

    ·字符串替换:public String replaceAll(String replacement)

  ·范例:字符串匹配&替换

 import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws Exception{
String str="101";
String regex="\\d+";
Pattern pattern=Pattern.compile(regex);//编译正则表达式
Matcher matcher=pattern.matcher(str);
System.out.println(matcher.matches());
}
}
 //字符串替换
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws Exception{
String str="101dsad1354asd3f6ds5a4d2s1f1231231adf12";
String regex="\\D+";
Pattern pattern=Pattern.compile(regex);//编译正则表达式
Matcher matcher=pattern.matcher(str);
System.out.println(matcher.replaceAll(""));
}
}

  如果纯粹的是以拆分、替换、匹配三种操作为例根本用不到java.util.regex开发包,只依靠String类就都可以实现了。但是Matcher类中提供有一种分组的功能,而这种分组的功能是String不具备的。

 import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws Exception{
//要求取出“#{内容}”标记中的所有内容
String str="INSERT INTO dept(deptno,dname,loc) VALUES(#{deptno},#{dname},#{loc})";
String regex="#\\{\\w+\\}";
Pattern pattern=Pattern.compile(regex);//编译正则表达式
Matcher matcher=pattern.matcher(str);
while (matcher.find()){//是否有匹配成功的内容
System.out.println(matcher.group(0).replaceAll("#|\\{|\\}",""));
}
}
}

  java.util.regex开发包,如果不是进行一些更为复杂的正则处理是很难使用到的,而String类所提供的功能只适合于正则的基本操作。

进阶Java编程(6)正则表达式的更多相关文章

  1. 进阶Java编程(13)反射与Annotation

    1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...

  2. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  3. 进阶Java编程(1)多线程编程

    Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...

  4. Java 编程下正则表达式判断字符串是否包含中文

    package cn.sunzn.demo; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ...

  5. 进阶Java编程(11)ClassLoader类加载器【待完成】

    1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...

  6. 进阶Java编程(9)反射与类操作

    1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...

  7. 进阶Java编程(7)反射机制

    反射机制 1,反射机制简介 在Java语言里面之所以会有如此多的开源技术支撑,很大的一部分是来自于Java最大的特征[反射机制].如果你不能够使用反射机制去进行项目的开发与设计,那么可以说你并未接触到 ...

  8. 进阶Java编程(5)基础类库

    Java基础类库 1,StringBuffer类 String类是在所有项目开发之中一定会使用到的一个功能类,并且这个类拥有如下的特点: ①每一个字符串的常量都属于一个String类的匿名对象,并且不 ...

  9. 进阶Java编程(3)线程的同步与死锁

    线程的同步与死锁 1,同步问题引出 在多线程的处理之中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,对于当多个线程访问统一资源的时候如果处理不当就会产生数据的错误 ...

随机推荐

  1. 安装docker以及常规操作

    一.安装 docker对内核版本是有要求的,反正建议用7以上的版本,少坑 如果需要卸载旧版本(凡是卸载删除操作都要谨慎!): yum remove docker \ docker-client \ d ...

  2. KERNEL_SECURITY_CHECK_FAILURE

    出现错误提示重装系统可以解决问题,但不需要重装系统.win8错误提示:KERNEL_SECURITY_CHECK_FAILURE提示对应错误代码:0x00000139 (0x00000003, 0x8 ...

  3. mac 安装laravel

    安装laravel之前先安装composer 使用 curl 指令下载: curl -sS https://getcomposer.org/installer | php 或是沒有安裝 curl ,也 ...

  4. 数据结构之双端队列(Deque)

    1,双端队列定义 双端队列:其两端都可以入列和出列的数据结构,如下图所示,队列后面(rear)可以加入和移出数据,队列前面(front)可以加入和移出数据 双端队列操作: deque=Deque() ...

  5. 9Patch图

    NinePatch是一种很有用的PNG图片格式,它可以在特定区域随文字大小进行缩放. - 上边线控制水平拉伸- 左边线控制竖直拉伸- 右边线和下边线控制内容区域 如下: 背景图片的中间区域会随着文字的 ...

  6. manifest节点

    xmlns:android属性——定义命名空间 这个属性定义了这个XML文件所使用的命名空间.如果需要指定特殊的命名空间,就需要手动编写代码,在Android Studio基本格式如下: xmlns: ...

  7. python函数的执行过程

    对于 Python 常规函数,都只有一个入口,但会有多个出口如 return 返回或者抛出异常.函数从入口进入会一直运行到 return 语句或者抛出异常,中间不会暂停,函数一直拥有控制权.当运行结束 ...

  8. Scala面向对象03

  9. c++后台开发面试常见知识点总结(二)网络编程

    (1)TCP和UDP有什么区别? TCP是传输控制协议,提供的是面向连接的,可靠地字节流服务.使用三次握手建立连接,四次挥手释放连接.UDP是用户数据报协议,传输的是UDP数据报,是无连接的,而且没有 ...

  10. C语言JS引擎

    基础知识 SpiderMonkey 简介 和其他的 JavaScript 引擎一样,SpiderMonkey 不直接提供像 DOM 这样的对象,而是提供解析,执行 JavaSccript 代码,垃圾回 ...