Java笔记11 - 正则表达式
时间:2020-04-28
本文章向大家介绍Java笔记11 - 正则表达式,主要包括Java笔记11 - 正则表达式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正则表达式简介
-
正则表达式用字符串来描述规则, 并用来匹配字符串
-
正则表达式有一套标准可以用于任何语言
-
java字符串用
\\
表示\
-
java.util.regex
内建了正则表达式引擎
匹配规则
- 匹配规则: 从左到右按规则匹配
- 正则表达式
abc
, 只能精确匹配"abc"
. - 如果正则表达式有特殊字符, 需要用
\
进行转义,a\&c
匹配"a&c"
- 正则表达式在java中也是一个字符串, 所以
a\&c
匹配a\\&c
, \
也是Java字符串的转义字符, 两个\\
表示一个\
- 匹配中文, 使用ASCII字符.
\u####
匹配任意字符
- 精确匹配意义不大, 直接用
String.equals()
可以做到 .
匹配任意一个字符, 且仅限一个字符
匹配数字
- 匹配
0
~9
数字:\d
进行匹配 \d
仅限单个字符- 各个名词含义区别:
\d
: 正则"\\d"
: java中用来表示正则的字符串"abc"
: 字符串, 其实正则在java中也是字符串
匹配常用字符
\w
: 匹配一个字母, 数字, 下划线\w
: 不能匹配:#
, 空格等
匹配空格字符
\s
匹配一个空格字符.- 还包括tab字符, (java中用
\t
)表示
匹配非数字等
\d
匹配数字,\D
匹配非数字\w
匹配字符,\W
匹配\w
不能匹配的\S
匹配\s
不能匹配的
重复匹配
*
: 匹配任意个字符, 就是好多个, 无限个+
: 至少匹配一个字符?
: 匹配一个或者0个{n}
: 匹配n个{n,m}
: 匹配n-m个
复杂匹配规则
匹配开头和结尾
^
表示开头$
表示结尾
匹配指定范围
[....]
匹配指定范围内字符[^...]
: 排除指定范围的字字符[1-9]
: 表示1-9[0-9a-fA-F]
: 表示大小不限制的十六进制
或规则匹配
|
: 两个正则规任选一个
使用括号
(...)
: 公共部分提取出来, 括号里面表示子规则
// learn go
String re = "learn\\s([jJ]ava|(p|P)hp|go)";
System.out.println("learn Java".matches(re));
System.out.println("learn php".matches(re));
System.out.println("go".matches(re));
分组匹配
- 使用
(...)
对规则进行分组
String reg = "(\\d{3,4})-(\\d{7,8})";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher("010-1234551");
if (m.matches()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
} else {
// 匹配失败
}
Pattern
String.matches()
调用的是Pattern
和Matcher
- 反复调用效率低
- 先创建
Pattern
, 然后反复使用, 编译一次, 多次匹配 group(0)
: 表示匹配整个字符串- 使用Matcher时, 必须首先调用
matches()
判断是否匹配成功.
非贪婪匹配
-
正则表达式使用贪婪模式, 尽可能多的向后匹配
-
?
表示非贪婪模式 -
?
的含义:\d??
-
举个例子:
(\d??)(9*)
, 匹配299999
: 结果->""
和"99999
-
因为
\d?
可以匹配1个9, 或者0个. 变成非贪婪模式, 就匹配0个.
搜索和替换
分割字符串
- 使用正则表达式分割字符串
String.split()
方法传入正则表达式.
搜索字符串
* 获取到Matcher
对象之后, 反复调用find()
方法.
替换字符串
String.replaceAll()
, 第一个参数是正则表达式, 第二个参数是待替换的字符串
反向指引
replaceAll()
: 第二个参数中, 可以使用$1, $2
代替, 前面的匹配到的模板
总结
Matcher m = pattern.matcher(template);
StringBuilder sb = new StringBuilder();
while (m.find()) {
String key = m.group(m.groupCount());
String value = data.get(key).toString();
m.appendReplacement(sb, value);
}
m.appendTail(sb);
return sb.toString();
appendReplacement
和appendTail
的神奇配合用法, 最后还是不理解这样可以成功的原因
原文地址:https://www.cnblogs.com/zhangrunhao/p/12794013.html
- 通过shell脚本得到数据字典的信息 (r2笔记72天)
- 机器学习算法实践——K-Means算法与图像分割
- 利用 Python、SciKit 和文本分类来构建客户行为描述模型
- 使用Python爬取社交网络数据分析
- PHP爬虫源码:百万级别知乎用户数据爬取与分析
- 使用Python抓取欧洲足球联赛数据
- python爬取百度新闻:分析共享单车火爆背后有哪些规则?
- Python爬虫(urllib2+bs4)数据采集:分析找出百度贴吧谁是水贴王
- 学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销
- 【手把手教你做项目】自然语言处理:单词抽取/统计
- Kaggle赛题解析:逻辑回归预测模型实现
- R语言 使用BP神经网络进行银行客户信用评估
- 使用R语言挖掘QQ群聊天记录
- 解析滴滴算法大赛---GBDT进行数据预测
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释