Java基础教程——正则表达式
正则表达式·Regular Expression
正则表达式就是一个用于匹配字符串的模板,正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
主要用到的对象:
java.util.regex.Pattern:正则表达式经编译后的表现模式
java.util.regex.Matcher:根据Pattern对象做为匹配模式,对字符串展开匹配检查
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test01正则表达式 {
public static void main(String[] args) {
// Pattern:正则表达式经编译后的表现模式
Pattern p = Pattern.compile("((13\\d))\\d{8}");// 匹配13开头手机号(\d:数字)
// Matcher:根据Pattern对象做为匹配模式,对字符串展开匹配检查。
Matcher m = p.matcher("13200000001,1500000001,13900000002");
while (m.find()) {
System.out.print(m.group());
System.out.print(" 起始位置:" + m.start());
System.out.println(" 结束位置:" + m.end());
}
}
}
运行结果:
13200000001 起始位置:0 结束位置:11
13900000002 起始位置:23 结束位置:34
更多语法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test02各种表达式 {
public static void main(String[] args) {
System.out.println("------预定义字符(即通配符)------");
test匹配("12abAB一二$_*#", ".", ".匹配任何一个字符");
test匹配("12abAB一二$_*#", "\\d", "(digit)匹配数字0-9");
test匹配("12abAB一二$_*#", "\\D", "匹配非数字");
test匹配("12abAB一二$_*#", "\\w", "(word)匹配单词字符,包括0~9,英文字母,下划线");
test匹配("12abAB一二$_*#", "\\W", "匹配非单词字符");
test匹配("12[ ]ab\rAB\n一二\t$_*#", "\\s", "(space)匹配空白字符");
test匹配("12[ ]ab\rAB\n一二\t$_*#", "\\S", "匹配非空白字符");
System.out.println("------边界匹配符------");
test匹配("never end", "er\\b", "\\b:匹配一个字边界,即字与空格间的位置");
test匹配("is a verb", "er\\B", "\\B:匹配非字边界");
test匹配("This is", "^(This)", "^匹配开头");
test匹配("The End.", "(End\\.)$", "$匹配结尾(.是预定义字符,需要转义一下)");
System.out.println("------[中括号用法]------");
test匹配("andy,bob,cat,dog", "[abc]", "字符集,匹配其中一个字符");
test匹配("00,01,1a,2c,3e,5f,6g", "[a-f]", "字符范围,匹配指定范围中任何字符");
test匹配("00,01,1a,2c,3e,5f,6g", "[^a-f]", "反向范围字符,匹配指定范围以外的任何字符");
test匹配("12abAB一二$_*#", "[\u4E00-\u9FA5]", "匹配中文");
System.out.println("------AND OR------");
test匹配("0123456789", "[1-9&&[^8]]", "&&:与,同时满足");
test匹配("0123456789", "[1-7,9]", "逗号");
test匹配("food,zood,wood", "(z|f)ood", "|:或");
System.out.println("------重复------");
test匹配("z_zo_zoo", "zo+", "一次或多次匹配");
test匹配("z_zo_zoo", "zo{1,}", "+ 等效于 {1,}");
test匹配("z_zo_zoo", "zo*", "零次或多次匹配");
test匹配("z_zo_zoo", "zo{0,}", "* 等效于 {0,}");
test匹配("z_zo_zoo", "zo?", "零次或一次匹配(多次配上也不管)");
test匹配("z_zo_zoo", "zo{0,1}", "? 等效于 {0,1}");
}
static void test匹配(String s, String sRegex, String msg) {
// Pattern:正则表达式经编译后的表现模式
Pattern p = Pattern.compile(sRegex);
// Matcher:根据Pattern对象做为匹配模式,对字符串展开匹配检查。
Matcher m = p.matcher(s);
System.out.print("【" + sRegex + "】" + msg + ":");
while (m.find()) {
System.out.print(m.group() + ",");
}
System.out.println();
}
}
运行结果:
------预定义字符(即通配符)------
【.】.匹配任何一个字符:1,2,a,b,A,B,一,二,$,_,*,#,
【\d】(digit)匹配数字0-9:1,2,
【\D】匹配非数字:a,b,A,B,一,二,$,_,*,#,
【\w】(word)匹配单词字符,包括0~9,英文字母,下划线:1,2,a,b,A,B,_,
【\W】匹配非单词字符:一,二,$,*,#,
【\s】(space)匹配空白字符: , , ,
,
, ,
【\S】匹配非空白字符:1,2,[,],a,b,A,B,一,二,$,_,*,#,
------边界匹配符------
【er\b】\b:匹配一个字边界,即字与空格间的位置:er,
【er\B】\B:匹配非字边界:er,
【^(This)】^匹配开头:This,
【(End\.)$】$匹配结尾(.是预定义字符,需要转义一下):End.,
------[中括号用法]------
【[abc]】字符集,匹配其中一个字符:a,b,b,c,a,
【[a-f]】字符范围,匹配指定范围中任何字符:a,c,e,f,
【[^a-f]】反向范围字符,匹配指定范围以外的任何字符:0,0,,,0,1,,,1,,,2,,,3,,,5,,,6,g,
【[一-龥]】匹配中文:一,二,
------AND OR------
【[1-9&&[^8]]】&&:与,同时满足:1,2,3,4,5,6,7,9,
【[1-7,9]】逗号:1,2,3,4,5,6,7,9,
【(z|f)ood】|:或:food,zood,
------重复------
【zo+】一次或多次匹配:zo,zoo,
【zo{1,}】+ 等效于 {1,}:zo,zoo,
【zo*】零次或多次匹配:z,zo,zoo,
【zo{0,}】* 等效于 {0,}:z,zo,zoo,
【zo?】零次或一次匹配(多次配上也不管):z,zo,zo,
【zo{0,1}】? 等效于 {0,1}:z,zo,zo,
常用验证:手机号、身份证号、邮箱
package ahjava.p04util.regular_Exp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test03常用效验 {
public static void main(String[] args) {
String[] sArray = null;
String sRegEx = null;
System.out.println("------手机号效验------");
// 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
// 联通号码段:130、131、132、136、185、186、145
// 电信号码段:133、153、180、189
sArray = new String[] { "13200000001", "15400000002", "13300000003" };
sRegEx = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
validate(sArray, sRegEx);
System.out.println("------身份证效验------");
sArray = new String[] { "42002719991231000X", "42002719991231A", "420027199912313",
"42002719991231004" };
sRegEx = "(^\\d{15}$)|(^\\d{17}(\\d|X|x)$)";
validate(sArray, sRegEx);
System.out.println("------邮箱效验------");
sArray = new String[] { "andy@163.com", "bob@qq.com", "cat@hotmail.99" };
sRegEx = "^\\w+@\\w+.[a-zA-Z]{2,3}(.[a-zA-Z]{2,3})?$";
validate(sArray, sRegEx);
}
static void validate(String[] sArray, String sRegEx) {
Pattern _pattern = Pattern.compile(sRegEx);
Matcher matcher = null;
for (String s : sArray) {
if (matcher == null) {
matcher = _pattern.matcher(s);
} else {
matcher.reset(s);
}
String result = s + (matcher.matches() ? "\t有效" : "\t无效");
System.out.println(result);
}
}
}
运行结果:
------手机号效验------
13200000001 有效
15400000002 无效
13300000003 有效
------身份证效验------
42002719991231000X 有效
42002719991231A 无效
420027199912313 有效
42002719991231004 无效
------邮箱效验------
andy@163.com 有效
bob@qq.com 有效
cat@hotmail.99 无效
Java基础教程——正则表达式的更多相关文章
- 黑马程序员:Java基础总结----正则表达式
黑马程序员:Java基础总结 正则表达式 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 正则表达式 import java.util.regex.*; 符合一定规 ...
- Java基础七-正则表达式
Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...
- Java基础教程(18)--继承
一.继承的概念 继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- Java基础教程:注解
Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- Java基础教程(5)--变量
一.变量 1.变量的定义 正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
随机推荐
- 使用udev高效、动态的管理Linux设备文件
导读: 在Linux环境中,所有的设备都以文件的形式存在,在早期的Linux版本中,/dev目录包含了了所有可能出现的设备文件,很难想象Linux用户如何从大量的设备文件中找到想要的设备文件.举个例子 ...
- java的“同一”与“相等”
变量:引用(指向地址) + 值(该变量指向值所储存的那一片内存) 两个变量同一 : 判断 是否 这两个变量指向同一片内存. 两个变量相等 : 判断 是否 这两个变量的类型相同,且值相等. 注:常用的& ...
- 彻底弄懂设置根元素字体大小calc(100vw/18.75) 实现rem自适应
rem 是相对文档根元素(html)字体大小的尺寸单位,当元素的尺寸或文字字号等使用 rem 单位时,会随着根元素的 font-size 变化而变化,那么在不同分辨率的设备下动态设置根元素的字体大小就 ...
- Vmware - 安装并启动 Centos 7
下载 Linux 安装包 http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/ 不同版本的 Centos https://mirrors.ali ...
- (2)ASP.NET Core3.1 Ocelot路由
1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...
- iptables从入门到掌握
防火墙简述 防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的.被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害. 防火墙: 工作在主机或者网络边缘,对于 ...
- 直播平台搭建之音视频开发:认识主流视频编码技术H.264
H.264简介 什么是H.264?H.264是一种高性能的视频编解码技术.目前国际上制定视频编解码技术的组织有两个,一个是"国际电联",它制定的标准有H.261.H.263.H.2 ...
- 为什么要谨慎使用Arrays.asList、ArrayList的subList?
1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List<Integer> statusList = Arrays.asL ...
- mongoDB之C#and.net Driver
之前一直都是用NodeJS来连接操作mongoDB的,但是最近需要用C#操作mongoDB的需要,所以研究了下C#驱动.mongoDB官方在GitHub上提供了C#驱动源码https://github ...
- 【T1543.003】利用 ACL 隐藏恶意 Windows 服务
看到一篇文章讲述了通过设置 DACL 隐藏 Windows 服务信息,便做一下总结. 技术原理 系统中每个 Service 在 Windows 中属于都一种对象(Object),用户在访问对象时的权限 ...