正则表达式

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(四)json

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

  2. 洛谷P5788 单调栈(模板)

    1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=3e6+10; 4 int n,a[N],s[N],ans[N ...

  3. 20个超棒的jQuery bootstrap 插件

    1. Bootstrap File Input Bootstrap3.x 的一个增强版的HTML 5 文件选择控件,可以对图片文件和文本文件进行预览,以及其他功能.该插件增强了这些插件,并且将组件的初 ...

  4. MFC-创建MFC图形界面dll

    创建MFC图形界面dll 概述: 利用MFC的DLL框架,制作带有图形界面的dll,可以实现很多功能. 流程: 选择静态链接MFC DLL:以免有的库没有. 采用该框架创建的MFC,会自动生产一个MF ...

  5. Linux中CentOS 7的安装及Linux常用命令

    1. 前言 什么是Linux Linux是一套免费使用和自由传播的操作系统.说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统. 为什么 ...

  6. 测试Thread中的常用方法:

    测试Thread中的常用方法:start():启动当前线程:调用当前线程的run()run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中currentThread ...

  7. 笔记:Debian下为sublime text建立软链接[像vi一样到处使用]

    先查询sublime-text安装路径 :~$ dpkg -L sublime-text /. /opt /opt/sublime_text ... /opt/sublime_text/sublime ...

  8. 利用xtrabackup8完全,增量备份及还原MySQL8

    利用xtrabackup8完全,增量备份及还原MySQL8 1.环境准备 服务器 作用 数据库版本 xtrabackup版本 10.0.0.8 数据备份 mysql8.0.26 8.0.28 10.0 ...

  9. JS 学习笔记(一)常用的字符串去重方法

    要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body> <input type="text" id="input" ...

  10. Codeforces Round #832 (Div. 2) A-D

    比赛链接 A 题解 知识点:贪心. 我们考虑把正数和负数分开放,显然把负数和正数放在一起的结果不会更优. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <b ...