本文参考菜鸟教程的文章 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() 能够输入以后匹配地位的指标字符串的起止地位
输入后果如下: