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等.其实,只有了解一种语言的正 ...
随机推荐
- js内置禁用按钮 disabled
按钮在监听到disabled后面的布尔值就可以实现是否禁用 一: <button :disabled="book.count <= 1" @click="de ...
- 复现CVE-2022-10270(向日葵远程代码执行漏洞)
警告 请勿使用本文提到的内容违反法律.本文不提供任何担保. 漏洞描述 向日葵是一款免费的,集远程控制电脑手机.远程桌面连接.远程开机.远程管理.支持内网穿透的一体化远程控制管理工具软件.CNVD披露了 ...
- 努力一周,开源一个超好用的接口Mock工具——Msw-Tools
作为一名前端开发,是不是总有这样的体验:基础功能逻辑和页面UI开发很快速,本来可以提前完成,但是接口数据联调很费劲,耗时又耗力,有时为了保证进度还不得不加加班. 为了摆脱这种痛苦,经过一周的努力,从零 ...
- Springboot 之 Mybatis-plus 多数据源
简介 Mybatis-puls 多数据源的使用,采用的是官方提供的dynamic-datasource-spring-boot-starter包的 @DS 注解,具体可以参考官网: https://g ...
- POJ2728 Desert King (最小生成树、0/1分数规划)
显然的0/1分数规划问题,用二分来解决,检验mid,就用prim算法求最小生成树,看总边权是否大等于0即可验证. 1 #include<bits/stdc++.h> 2 using nam ...
- DDD-领域驱动(四)-使用IMediator 实现领域事件
领域事件是指:一个领域中出触发的 集成事件是指:多个微服务之前产生的事件 核心对象 IMediator INotification INotificationHandler 引入:IMediator ...
- phoenix操作HBase
phoenix操作HBase 一.Phoenix简介 Phoenix,由saleforce.com 开源的一个项目,后又捐给了Apache. 它相当于一个Java 中间件,帮助开发者,像使用jdbc ...
- IOC常用的创建对象方式
通过无参构造方法来创建 1.User.java public class User { private String name; public User() { System.out.println( ...
- 通过QQ抓IP查询地址
使用工具: Wireshark 可以直接搜索官网获取,个人用的免费的,也可以直接在kali中也是可以直接用的.这里就不介绍怎么安装了,网上很多. 步入正题: 通过wireshark进行抓包查地址,需要 ...
- 齐博x1动态改变标签调用不同频道的数据
标签默认需要设置标签参数 type 指定调用哪个频道的数据,比如下面的代码,需要默认指定商城的数据, {qb:tag name="qun_pcshow_shop001" type= ...