大数据之路week04--day05(java 正则表达式)
1.1 正则表达式
1.2 简介
Regular Expression 正则表达式 常简称为: regex、正则
正则表达式是一整套约束字符串的语法规则,独立于任何编程语言
正则表达式 方便、灵活、功能强大,多部分编程语言都对正则表达式提供了支持
我们通常把正则作为一个工具,进行字符串的 校验、获取、替换等操作
1.2 普通字符和元字符
正则表达式中,所有字符分为两类:普通字符和元字符(具有特殊含义的字符)
主要普通字符:小写字母、大写字母、数字、下划线、部分特殊符号、非西文字符等
主要元字符:. \ { } * + ? ( ) [ ] - | ^ $
. 表示任意一个字符(除了换行符)
\ 转移符,用来改变其他字符的含义,
如:
\元字符 把元字符转义为普通字符,如\. 把元字符 . 转义为普通字符的 .
\普通字符 把普通字符转义为含有特殊含义的字符,如\n 换行符,\r 回车符,\t 制表符
2 java对正则的支持
2.1 Pattern类
Java提供了java.util.regex.Pattern 类来创建正则表达式对象
public static boolean matches(regex, str) // 用来判断str是否匹配regex,或者说用来判断str是否符合regex的要求

import java.util.regex.Pattern; public class RegexTest
{
public static void main(String[] args)
{
String regex = "abc";// 要求字符串为"abc"
String str = "abc"; boolean match = Pattern.matches(regex, str);
System.out.println(match);//输出true
}
}

2.1.1 元字符的用法
易错点:
1 Java代码中的 \\ 只表示正则中的 \
2 \n表示换行符,即使用\和n这两个字符组合在一起表示一个换行字符

public static void main(String[] args)
{
/*
String regex = ".";// .在正则中标识任意字符,要求str="任意字符"
String str = "a"; boolean match = Pattern.matches(regex, str);
System.out.println(match);//输出 true
*/ String regex = "\\.";// 相当于正则中的\.,要求str="."
String str = "a"; boolean match = Pattern.matches(regex, str);
System.out.println(match);//输出 false
}

2.1.2 重复匹配
(x表示一个字符,或者一个字符类,或者一个组等)
x{n} x连续出现n次
x{n,} x至少连续出现n次
x{n,m} x至少连续出现n次,至多连续出现m次
x* x连续出现0次或多次,等同于x{0,}
x+ x至少连续出现1次,等同于x{1,}
x? x出现0次或1次,等同于x{0,1}
/* String regex = "a{3}";// 要求a连续出现3次,str="aaa"
String str = "a";//false
*/
/* String regex = "a{3,6}";// 要求a至少连续出现3次,str="aaa.."
String str = "aaaaa";//true
*/
String regex = "a?";
String str = "a";//true
boolean match = Pattern.matches(regex, str);
System.out.println(match);
2.1.3 选择匹配
使用 | 实现选择匹配,即多个选项中任选一个
a|b|c 匹配a或者b或者c
red|blue|green 匹配red或者blue或者green

/*
String regex = "a|b|c";// str="a" "b" "c"
String str = "b";//true
*/
String regex = "red|blue|green";// str= "red"或"blue"或"green"
String str = "blue";//true boolean match = Pattern.matches(regex, str);
System.out.println(match);

2.1.4 字符类
匹配候选字符的任意一个
[ ] [abc] 匹配abc中任意一个字符,类似 a|b|c
[^ ] [^abc] 匹配非abc的任意一个字符
[ - ] [0-9]、[a-z]、[a-zA-Z] 匹配范围内的任意一个字符
注意:字符类中的元字符(\除外),会被自动转义为普通字符,比如 [.] 等同于 [\.]
\w 代表一个单词字符,类似于[a-zA-Z0-9_],有的语言中也可以匹配中文
\W 代表一个非单词字符,类似于[^a-zA-Z0-9_]
\d 代表一个数字字符,等同于[0-9]
\D 代表一个非数字字符,等同于[^0-9]
\s 代表一个空白字符
\S 代表一个非空白字符
// String regex = "hello[abc]";// str="helloa" "hellob" "helloc"
// String regex = "[0-9]";// str="0" "1"..."9"
2.2 Matcher类
Java还提供了 java.util.regex.Matcher 匹配器类,用来支持复杂的正则操作
Matcher matcher = Pattern.compile(regex).matcher(str);
boolean find = matcher.find();// 查找str中是否有下一个匹配regex的子字符串
String group = matcher.group();// 返回当前和regex匹配的子字符串
//典型用法
while (matcher.find()) {
String substr = matcher.group();
// ...
}
贪婪匹配:在重复匹配时,默认会匹配尽可能多的字符
非贪婪匹配:在重复匹配后面加上?问号,会匹配尽可能少的字符(并不严格)

public static void main(String[] args) {
// String regex = "ab";// 要求str的子字符串substr="ab"
// String str = "xabxxabmmabx";
//打印出一个字符串里面的所有的qq邮箱
String regex = "[1-9][0-9]{4,}@qq.com";// qq邮箱的正则表达式写法
String str = "xx12345@qq.comabc123456@qq.commm1234567@qq.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}
}

输出:
12345@qq.com
123456@qq.com
1234567@qq.com
2.2.1 贪婪匹配和非贪婪匹配
贪婪匹配:在重复匹配时,默认会匹配尽可能多的字符。这也是正则中默认的匹配模式。
非贪婪匹配:在重复匹配后面加上?问号,会匹配尽可能少的字符(并不严格)
注意下面三处代码的不同
1.

String regex = "[1-9][0-9]{4,}";// qq邮箱的正则表达式写法
String str = "xx012345@qq.comabc0123456@qq.commm1234567@qq.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}

输出:
12345
123456
1234567
2.

String regex = "[1-9][0-9]{4,}?";// qq邮箱的正则表达式写法
String str = "xx012345@qq.comabc0123456@qq.commm1234567@qq.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}

输出:
12345
12345
12345
3.

String regex = "[1-9][0-9]{4,}@qq.com";// qq邮箱的正则表达式写法
String str = "xx012345@qq.comabc0123456@qq.commm1234567@qq.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}

输出:
12345@qq.com
123456@qq.com
1234567@qq.com
2.3 String支持正则操作的方法
由于正则表达式和字符串如此相关,Java就为 java.lang.String 字符串类提供了若干可以直接进行正则操作的方法。
这里有个小技巧,String的方法中参数为regex的都是支持正则的。
//使用replacement替换全部匹配regex的子字符串
String newStr = str.replaceAll(regex, replacement);
String[] newStrs = str.split(regex);//使用regex作为分隔符切分str
boolean match = str.matches(regex);// 等同于Pattern.matches(regex, str)
String str="0123456789";
System.out.println(str.replaceAll("[0-9]", "*"));
System.out.println("--------------------------------------");
String str2="apple12orange84745banana666hello";
String[] parts = str2.split("[0-9]+");
System.out.println(Arrays.toString(parts));
输出:
**********
--------------------------------------
[apple, orange, banana, hello]
大数据之路week04--day05(java 正则表达式)的更多相关文章
- 大数据之路week04--day05(java XML解析)
java解析XML的四种方式: XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不 ...
- C#码农的大数据之路 - 使用C#编写MR作业
系列目录 写在前面 从Hadoop出现至今,大数据几乎就是Java平台专属一般.虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势. ...
- 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)
什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...
- 大数据之路week04--day06(I/O流阶段一 之异常)
从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房 ...
- 通往大神之路,百度Java面试题前200页。
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...
- 大数据之路week01--自学之集合_1(Collection)
经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...
- 大数据之路day01_1--Java下载、安装等配置
从今天开始,我就正式的走上大数据的道路了,如果说我为啥要去学习大数据,可能我的初衷是以后可以接触到人工智能方面的技术,后来在自学的过程中发现,学习人工智能,需要扎实的算法,以及对大量数据的处理,再者, ...
- 大数据之路week07--day06 (Sqoop 将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具)
为了方便后面的学习,在学习Hive的过程中先学习一个工具,那就是Sqoop,你会往后机会发现sqoop是我们在学习大数据框架的最简单的框架了. Sqoop是一个用来将Hadoop和关系型数据库中的数据 ...
- 大数据之路week06--day01(VMware的下载与安装、安装CentOS)
好了,从今天开始就开始正式的进入大数据道路的轨道上了,当然了,Java 也是需要不断地在日后进行反复地学习,熟练掌握.(这里我要说一下,Java种还有一些I/O流.Lambda表达式和一些常用工具类有 ...
随机推荐
- thinkphp5 验证器 validate 和 layer
首先tp5的验证器使用特方便 设置规则即可通用 首先页面html(layer 配合) 毕竟是后端 尽量用一些成熟的前台框架 之前用boostrap $.ajax({ url:'/index/Regi ...
- win7下exe文件设置为开机启动
如何将自己的exe程序设置为开机自启动 如何将自己的exe程序设置为开机自启动 将自己的exe程序设置为开机自启动话不多说,直接看 首先1:cmd—>regedit 其次找到下面的路径就可以:( ...
- csu 1909: Perfect Chocolate
1909: Perfect Chocolate Submit Page Summary Time Limit: 3 Sec Memory Limit: 128 Mb Submi ...
- [学习笔记] Blender layout 视图切换
layout 数字键5 --- 正交视图/透视图 切换 数字键0 -- 摄像机视图 数字键7 -- 顶视图 数字键1 --- 前视图 数字键3 --- 右视图 ctrl +数字键3 --- 左视图 ...
- java日志框架系列(6):logback框架encoder详解
1.Encoder 1.encoder功能 Encoder 负责两件事,一是把事件转换为字节数组,二是把字节数组写入输出流. 注意:在logback 0.9.19 版之前没有 encoder. 在之前 ...
- 脉脉的一道网红Java面试题
题目如下: public class Test { public static void main(String[] args) { int a = 10; int b = 10; // 需要在met ...
- Spring AOP 简介(三)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- (十)EL表达式和JSTL标签快速入门
目录 什么是 el 表达式 示例:使用EL表达式获取pageContext .request.session.application域中的数据: 示例:使用EL表达式获取Bean属性 获取当前WEB应 ...
- 关闭iTunes自动同步
方法步骤: 仅对iTunes安装在默认路径的生效. 在「运行」里边先后输入以下两条命令: "C:\Program Files\Common Files\Apple\Apple Applica ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
