本文参考菜鸟教程的文章 https://www.runoob.com/java/java-regular-expressions.html
为什么要用正则表达式?
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。计算机处理的信息更多的时候不是数值而是字符串,正则表达式就是在进行字符串匹配和处理的时候最为强大的工具,绝大多数语言都提供了对正则表达式的支持。
个人认为学习正则表达式需要掌握的知识前提是:
1. Java String(用于操作)
2. 自动机(工作原理)
知识点回顾:
1. 定义:正则表达式定义了字符串的模式。
2. 使用场景:正则表达式可以用来搜索、编辑或处理文本。
3. 灵活性:正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
Java正则表达式 三大类:
String、Pattern、Matcher
String: 存储字符串
Pattern:存储匹配模式
Matcher:存储匹配结果
当我们利用String和Pattern生成了Matcher之后,后续的操作以使用Java为我们提供的Matcher类中各种方法为主。
下面通过几个例子演示如何使用Java 正则表达式解决问题。
- 我们拿《三国演义》中《三英战吕布》的情节来说明,原文如下:
- 正议间,吕布复引兵搦战。八路诸侯齐出。公孙瓒挥槊亲战吕布。战不数合,瓒败走。吕布纵赤兔马赶来。那马日行千里,飞走如风。看看赶上,布举画戟望瓒后心便刺。傍边一将,圆睁环眼,倒竖虎须,挺丈八蛇矛,飞马大叫:“三姓家奴休走!燕人张飞在此!”吕布见了,弃了公孙瓒,便战张飞。飞抖擞精神,酣战吕布。连斗五十余合,不分胜负。云长见了,把马一拍,舞八十二斤青龙偃月刀,来夹攻吕布。三匹马丁字儿厮杀。战到三十合,战不倒吕布。刘玄德掣双股剑,骤黄鬃马,刺斜里也来助战。这三个围住吕布。转灯儿般厮杀。八路人马,都看得呆了。吕布架隔遮拦不定,看着玄德面上,虚刺一戟,玄德急闪。吕布荡开阵角,倒拖画戟,飞马便回。三个那里肯舍,拍马赶来。八路军兵,喊声大震,一齐掩杀。吕布军马望关上奔走;玄德、关、张随后赶来。古人曾有篇言语,单道着玄德、关、张三战吕布。
如果要找出所有的“吕布”,那么我们的匹配规则可以这样给出:
".\吕布.\"
如果我们想要查询字符串中一共出现了多少次吕布,代码可以这样写:
public class RegixTest {
public static String text = "正议间,吕布复引兵搦战。八路诸侯齐出。公孙瓒挥槊亲战吕布。战不数合,瓒败走。吕布纵赤兔马赶来。那马日行千里,飞走如风。看看赶上,布举画戟望瓒后心便刺。傍边一将,圆睁环眼,倒竖虎须,挺丈八蛇矛,飞马大叫:“三姓家奴休走!燕人张飞在此!”吕布见了,弃了公孙瓒,便战张飞。飞抖擞精神,酣战吕布。连斗五十余合,不分胜负。云长见了,把马一拍,舞八十二斤青龙偃月刀,来夹攻吕布。三匹马丁字儿厮杀。战到三十合,战不倒吕布。刘玄德掣双股剑,骤黄鬃马,刺斜里也来助战。这三个围住吕布。转灯儿般厮杀。八路人马,都看得呆了。吕布架隔遮拦不定,看着玄德面上,虚刺一戟,玄德急闪。吕布荡开阵角,倒拖画戟,飞马便回。三个那里肯舍,拍马赶来。八路军兵,喊声大震,一齐掩杀。吕布军马望关上奔走;玄德、关、张随后赶来。古人曾有篇言语,单道着玄德、关、张三战吕布。";
public static String regix = "[u4e00-u9fa5]*吕布[u4e00-u9fa5]*";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(regix);
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()){
System.out.println("吕布 出现位置:");
System.out.print(matcher.start() + "," + matcher.end());
count++;
}
System.out.println("文中一共出现了" + count + "次 吕布");
}
}
[u4e00-u9fa5]表示一个中文字符,包括中文标点符号。
matcher.find() 可以找到下一个匹配的位置
mather.start()/end() 可以输出当前匹配位置的目标字符串的起止位置
输出结果如下:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。