正则表达式 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 正则表达式的更多相关文章

  1. Java 笔记 —— java 和 javac

    Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...

  2. 菜鸡的Java笔记 - java 断言

    断言:assert (了解)        所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容        范例:观察断言 public class Abnorma ...

  3. 菜鸡的Java笔记 - java 线程常用操作方法

    线程常用操作方法        线程的命名操作,线程的休眠,线程的优先级            线程的所有操作方法几乎都在 Thread 类中定义好了            线程的命名和取得      ...

  4. 菜鸡的Java笔记 - java 访问控制权限

    java中四种访问控制权限的使用                内容            在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...

  5. 菜鸡的Java笔记 - java 常用类库

    CommonClassLibrary 常用类库        定时调度            定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式                    con ...

  6. 菜鸡的Java笔记 - java 反射机制

    反射机制        1.观察 Class 类的使用        2.利用反射改善工程设计模式        3.反射操作类结构            content (内容)        1. ...

  7. 菜鸡的Java笔记 java基础类库 BaseClassLibrary

    java基础类库 BaseClassLibrary        StringBuffer 类的特点        StringBuffer,StringBuilder,String 类之间的关系   ...

  8. 菜鸡的Java笔记 java数据库编程(JDBC)

    java数据库编程(JDBC)        介绍 JDBC 的基本功能            content (内容)        现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...

  9. 菜鸡的Java笔记 - java 枚举

    枚举        枚举属于加强版的多例设计模式            多例设计模式与枚举        多例设计模式的本质在于构造方法的私有化.而后在类的内部产生若干个实例化对象,随后利用一个 st ...

随机推荐

  1. [源码解析] PyTorch 流水线并行实现 (4)--前向计算

    [源码解析] PyTorch 流水线并行实现 (4)--前向计算 目录 [源码解析] PyTorch 流水线并行实现 (4)--前向计算 0x00 摘要 0x01 论文 1.1 引论 1.1.1 数据 ...

  2. vue组件的生命周期详解

    1.生命周期&生命周期函数 生命周期:指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段. 生命周期函数:由vue框架提供的内置函数,会伴随着组件的生命周期,自动按序执 ...

  3. vue-devtools 安装

    vue火了很久了,但是一直赶不上时代步伐的我今天才开始学,首先,根据vue官网介绍,推荐安装Vue Devtools.它允许你在一个更友好的界面中审查和调试 Vue 应用. 首先,将vue-devto ...

  4. 15-ThreadLocalRandom类剖析

    ThraedLocalRandom类是JDK7在JUC包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷. Random类及其缺陷 下面看一下java.util.Random的使用方法. ...

  5. Mybatis 一级缓存 (20)

    Mybatis中的一级缓存和二级缓存(本博文只是针对一级缓存说明) 概述 ORM框架一般都会有缓存机制,做为其中一员的Mybatis也存在缓存.功能是用以提升查询的效率和服务给数据库带来压力.同样的M ...

  6. AIbee 笔试

    CSS选择器 div+p 选择紧接在div元素之后的所有< p >元素 C++删除数组最后一个元素. 例如[1 2 3 4] 最后变为 [1 2 3] 用splice的删除,增加和替换 a ...

  7. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  8. Alpha-技术规格说明书

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.架构与技术栈 1.整体架构 本项目的整体架构如上图所示.下面我们将对涉及 ...

  9. [对对子队]会议记录4.20(Scrum Meeting11)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第三关,添加了运行指令标识 ​ 相关issue:搭建关卡2.3 ​ 相关签入:4.20签入1 4.20签入2 吴昭邦 ​ 工作内容:搭建第三关 ​ 相关iss ...

  10. 【SDOI2014】数数(补)

    见 AC自动机(补坑了) [SDOI2014] 数数 简要题意:  我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为子串.例如当S={22,333,0233}时 ...