正则表达式 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. 安装SpaCy出现报错:requests.exceptions.ConnectionError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443):

    内含安装步骤及报错解决:https://www.cnblogs.com/xiaolan-Lin/p/13286885.html

  2. 云无关、桌面端、基于Kubernetes的平台Otomi

    一.Otomi介绍 Otomi官网:https://otomi.io/ Otomi-core核心模块Github地址:https://github.com/redkubes/otomi-core Ot ...

  3. ☕【Java技术指南】「编译器专题」深入分析探究“静态编译器”(JAVA\IDEA\ECJ编译器)是否可以实现代码优化?

    技术分析 大家都知道Eclipse已经实现了自己的编译器,命名为 Eclipse编译器for Java (ECJ). ECJ 是 Eclipse Compiler for Java 的缩写,是 Jav ...

  4. WinForm 控件 DataGridView 常用操作

    1.取消列自动生成 在窗体load事件里面设置表格dataGridView的AutoGenerateColumns为 false dataGridView.AutoGenerateColumns = ...

  5. Python | 一键生成九宫格图片

    一键生成九宫格图片 首先我们准备几张图片: 将代码文件放在放置图片的地方,用软件打开: 点击运行,在当前目录下会生成一个文件夹: 打开新生成的文件夹: 打开对应图片的名称文件夹: 如果不想图片被分成9 ...

  6. 每日总结:String类(2021.10.6)

    String创建的字符串存储在公共池中 如: String s1="Runoob": new创建的字符串对象在堆上 如: String s2=new String("Ru ...

  7. redis分片集群安装部署

    redis分片集群安装与部署 分片集群的优势 高可用.且方便扩展. 数据分片,多节点提供服务,提高性能,数据提供冗余备份. 分片集群部署 只需更改配置文件 部署架构:6个节点,3主3从.数据集分为3片 ...

  8. Java(15)面向对象之继承

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201615.html 博客主页:https://www.cnblogs.com/testero ...

  9. Arp欺骗和DNS投毒的实验性分析

    1.中间人攻击之Arp欺骗/毒化 本文涉及网络安全攻击知识,随时可能被永久删除.请Star我的GitHub仓库 实现原理: 这种攻击手段也叫做中间人攻击MITM(Man-in-the-Middle) ...

  10. Golang通脉之基础入门

    为什么要学 Go 性能优越感:Go 极其地快,其性能与 Java 或 C++相似.在使用中,Go 一般比 Python 要快 30 倍: 序列化/去序列化.排序和聚合中表现优异: 开发者效率较高:多种 ...