本文参考菜鸟教程的文章 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() 可以输出当前匹配位置的目标字符串的起止位置
输出结果如下:
image.png


御龙镜中潜
62 声望4 粉丝

The more I have learnt, the more I need to learn.