Day37:正则表达式详解
正则表达式
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:正则表达式详解的更多相关文章
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Java 正则表达式详解_正则表达式
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...
- (转)linux正则表达式详解
linux正则表达式详解 http://blog.csdn.net/wuliowen/article/details/64131815 1:什么是正则表达式: 简单的说,正则表达式就是处理字符串的方法 ...
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
- Django路由配置之正则表达式详解
正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...
- Linux 正则表达式详解
正则表达式(REGULAR):为处理大量的字符串而定义的一套规则和方法,为了处理大量字符串而生 常见命令参数 基础正则表达式 . :有且只有任意一个字符(包括空格) * :重复前面任意0或者多个字符 ...
- Python正则表达式详解——re库
一.简介 1.1.相关链接 官方文档: Python2:https://docs.python.org/2/library/re.html Python3:https://docs.python.or ...
- php中正则表达式详解
概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...
随机推荐
- 聊聊Vim的工作原理
聊聊Vim的工作原理 日常里一直在用Vim这个编辑器,前阵子学习关于Linux中的fd(文件描述符)时,发现vim的进程描述符会比上一个自动加一,后续了解到vim的工作原理后,解开了这个疑问,所以记录 ...
- 关于docker-环境部署及拉取镜像创建容器的过程记录
背景:因安全部门要求对特定几台应用主机的进行漏洞及脆弱性扫描,使用的工具需要基于docker环境,即他们提供镜像,让我们创建成容器,于是将整个环境安装及创建docker容器的过程记录于此 1.还是先得 ...
- The project was not built due to "Could not delete '/XXX/WebRoot/WEB-INF/classes/library'.". Fix the problem, then try refreshing this project and building
在构建插件时提示如下错误: Description Resource Path Location Type The project was not built due to "Could n ...
- Kafka之工作流程分析
Kafka之工作流程分析 kafka核心组成 一.Kafka生产过程分析 1.1 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(pa ...
- Shading-JDBC、ShadingSphere、ShardingProxy 使用详解
ShadingSphere ShardingSphere是一款起源于当当网内部的应用框架,2015年在当当网内部诞生,2016年由主要开发人员张亮带入京东数科,在国内经历了当当网.电信翼支付.京东数 ...
- 成功解决:snippet设置的开机自启没有效果
1.问题描述 勾选开机启动后.没有效果.每次开机都要我重新找到对应的安装目录.双击运行开启 2.解决方法 将snipaste的快捷方式放到开机启动目录下 C:\Users\Administrator\ ...
- DevOps|1024程序员节怎么做?介绍下我的思路
1024,祝每个程序员小哥哥小姐姐节日快乐. 因为在研发效能部门,我支持过几次 1024 程序员节的活动,所以经常有朋友问我1024 程序员节怎么做,本篇就是简单介绍下我的思路,希望对你有用. 102 ...
- Multi-Channel PCIe QDMA Subsystem
可交付资料: 详细的用户手册 Design File:Post-synthesis EDIF netlist or RTL Source Timing and layout constraints,T ...
- 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...
- 本地文件上传Gitee
0.对于小白来说,我再细讲一下 一.下载git 下载细节参考博客 二.Git配置 点击桌面的图标,进入Git Bash Here 1.配置自己的用户名和邮箱 git config --global u ...