正则表达式

1.1 概述

正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。

比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确正是由

正则表达式所控制的。

1.2 与普通方法的对比

案例:要求校验QQ账号的格式,账号信息全为数字,位数在6-12位之间。

我们不使用正则表达式进行编码:

import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入QQ账号");
String a=sc.nextLine();
System.out.println(checkQQ(a));
} //校验QQ账号信息的方法
public static boolean checkQQ(String a){
if(a==null){//账号为空则返回false
return false;
}
if(a.length()>12||a.length()<6){//控制账号长度
return false;
}
for(i=0;i<a.length();i++){
char c=a.char(i);//控制账号全为数字
if(c<"0"||c>"9"){
return false;
}
}
return true;//以上方法将非数字、超长度的情况进行了排除,留下来的必定符合要求
}
}
请输入QQ账号
87398177a
false

以上是我们不通过正则表达式来写的代码,可以看出来比较繁琐;

接下来我们用正则表达式来实现我们QQ账号信息的校验

public class Test{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入QQ账号");
String a=sc.nextLine();
System.out.println(checkQQ2(a));
}
public static boolean checkQQ2(String a){
return a!=null&a.matches("\\d{6,12}");//matches是使用正则表达式的方法
}
}

我们可以观察到正则表达式应用在校验数据格式的情况时代码非常的简单

1.3 匹配规则

字符类(默认只匹配一个字符)

符号 说明
[abc] 只能是a、b、c其中一个
[^abc] 除了a、b、c都可以
[a-zA-Z] a-z以及A-Z中的一个
[a-d[m-p]] a-d或者m-p中的一个
[a-z&&[def]] a-z和def的交集中的一个

预定义的字符类(默认只匹配一个字符)

符号 说明
. 任意字符
\d 一个数字[0-9]
\D 非数字:[ ^0-9 ]
\s 一个空白符:[\t\n\x0B\f\r]
\S 非空白符:[^\s]
\w 英文、数字、下划线 [a-zA-Z_0-9]
\W 一个非单词英文[^W]

贪婪的量词(配合匹配多个字符

符号 说明
X? X,一次或者没有
X* X,0次或者多次
X+ X,一次或者多次
X{n} X,n次
X{n,} X,至少n次
X{n,m} X,n-m次

1.4 常见案例

  • 请编写程序模拟用户输入手机号码,验证格式是否正确并给出提示直到格式输入正确为止
  • 请编写程序模拟用户输入邮箱号码,验证格式是否正确并给出提示直到格式输入正确为止
  • 请编写程序模拟用户输入座机号码,验证格式是否正确并给出提示直到格式输入正确为止
import java.util.Scanner;
//正则表达式检查用户输入的数据是否符合要求
public class MobliePhoneCheck {
public static void main(String[] args) {
//checkMp();
//checkEmail();
checkTel();
} //正则表达式检查用户输入的手机号码是否符合要求
public static void checkMp(){
Scanner sc = new Scanner(System.in);
while (true) {//巧用while循环 CTRL+alt+t 快速生成while循环
System.out.println("请输入您的手机号码");
String s=sc.nextLine();
if(s.matches("1[3-9]\\d{9}")){//手机号码开头为1、第二位数为3-9、后面再跟9为数字
System.out.println("手机号码输入成功");
break;//记得打破循环
}else {
System.out.println("手机号码格式有误");
}
}
}
//邮箱格式检测 873981777@qq.com 873981777@163.com 873981777@163.com.cn 满足三种形式
//数字位6-12位;一个@;邮箱类型含数字和英文;域名两级
public static void checkEmail(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您的邮箱号码");
String s=sc.nextLine();
if(s.matches("\\d{6,12}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}")){
System.out.println("邮箱输入成功");
break;
}
else {
System.out.println("邮箱格式有误");
}
}
} //座机号码检测 区位三个,号码8个
public static void checkTel(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入座机号码");
String a=sc.nextLine();
if(a.matches("0\\d{2}-?\\d{8}")){
System.out.println("座机号码输入成功");
}else{
System.out.println("座机号码格式有误");
} }

1.5 正则表达式的方法

方法名 说明
public String replaceAll(String regex,String newStr) 将正则表达式指定的内容替换成想要内容
public String[] split(String regex) 将正则表达式指定的内容作为分隔符(注意返回的是数组)

下面对方法进行演示

import java.util.Arrays;

public class ExpressionMethod {
public static void main(String[] args) { //split 将正则表达式指定的格式作为分隔符分隔字符串并返回数组
String a="中交sadee二航局saj41523Jianzh建筑工程有限公司";
String[] s=a.split("[a-zA-Z0-9]+");
System.out.println(Arrays.toString(s));//用数组重写的toString打印
for (int i = 0; i < s.length; i++) {//或者for循环遍历出来
System.out.println(s[i]);
}
//replaceAll 将正则表达式指定的格式的内容替换成自己想要的内容
String b=a.replaceAll("[]a-zA-Z0-9]+","\t");
System.out.println(b); }

1.6 拓展——爬取信息

在一堆杂乱的信息中获取到有效的信息:电话号码、邮箱等等......

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class GetImformation {
//利用正则表达式在一堆信息中提取有效的信息
/*
来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:983647111@qq.com
*/
public static void main(String [] args){
String e="来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:983647111@qq.com";
//提取有效信息第一步: 先创建一个正大表达式规则
String a="\\d{9}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}|\\d{1,11}|1[3-9]\\d{9}" ;
//第二步:编译规则并封装成一个编译器Pattern
Pattern p=Pattern.compile(a);//compile为编译的意思,将我们指定的规则编译
//第三步:调用编译器匹配功能生成一个匹配器 Matcher 即用编译器的规则去匹配目标内容
Matcher m = p.matcher(e);
//第四步:调用匹配器的查找功能:find;调用group方法将查找到的内容生成一个新的字符串:group
while (m.find()){
String g = m.group();
System.out.println(g);
}
}
}

Day37:正则表达式详解的更多相关文章

  1. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  2. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  3. Java 正则表达式详解_正则表达式

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  5. (转)linux正则表达式详解

    linux正则表达式详解 http://blog.csdn.net/wuliowen/article/details/64131815 1:什么是正则表达式: 简单的说,正则表达式就是处理字符串的方法 ...

  6. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  7. Django路由配置之正则表达式详解

    正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...

  8. Linux 正则表达式详解

    正则表达式(REGULAR):为处理大量的字符串而定义的一套规则和方法,为了处理大量字符串而生 常见命令参数 基础正则表达式 . :有且只有任意一个字符(包括空格) * :重复前面任意0或者多个字符 ...

  9. Python正则表达式详解——re库

    一.简介 1.1.相关链接 官方文档: Python2:https://docs.python.org/2/library/re.html Python3:https://docs.python.or ...

  10. php中正则表达式详解

    概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...

随机推荐

  1. Node.js(二)express

    npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) a ...

  2. 老杜MySql——34道作业题

    老杜MySql链接:https://www.bilibili.com/video/BV1Vy4y1z7EX?p=132 本次随笔主要来源于老杜MySql讲解视频后面的作业题,加上个人的一些理解,以及整 ...

  3. Codeforces Round #442 (Div. 2) B. Nikita and string

    题意:求最长可以分a b a为三部分子串,a b a可以为空 思路在代码里 1 #include<cstdio> 2 #include<iostream> 3 #include ...

  4. 洛谷P2517 HAOI2010 订货 (费用流)

    标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 ...

  5. Docker Desktop 可以直接启用Kubernetes 1.25 了

    作为目前事实上的容器编排系统标准,K8s 无疑是现代云原生应用的基石,很多同学入门可能直接就被卡到第一关,从哪去弄个 K8s 的环境, Docker Desktop 自带了Kubernetes 服务, ...

  6. capability参数配置

    前言 本文为在霍格沃兹测试开发学社的学习经历分享 简介 功能:配置 Appium 会话,告诉 Appium 服务器需要自动化的平台的应用程序 形式:键值对的集合,键对应设置的名称,值对应设置的值 主要 ...

  7. 面向对象day1,创建类和对象时,对象内存是在哪

    上面我创建了两个类,一个是测试类,在测试包里面,一个是生产类,在src文件里面.可以看到,调用类里面的对象的时候需要先创建一个对象,然后通过对象来调用类里面的属性和方法等,但是这个时候我得先记录一下, ...

  8. import cv2报错

    其实是没错的,不过有的python编译器对这个不太支持,把import cv2 改为import cv2.cv2 as cv2就行了.

  9. Blog1:nchu-software-oop-2022-1~3

    (1) 前言 针对在完成三次作业过程中产生的问题进行总结与分析. 三次作业一共十五(9+3+3)道题目,其中前两次难度较为简单,第三次复杂程度飞跃式上涨. 其中,涉及到java语言中基本的输入输出语句 ...

  10. Java多线程-线程生命周期(一)

    如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程. Java多线程说它难,也不难,就是有点绕:说它简单,也不简单,需要理解的概念很多,尤 ...