正则表达式 | 浅解
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。是一个用于匹配字符串的模板。
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
部分参考自:https://www.runoob.com/regexp/regexp-syntax.html
正则表达式:在线工具
1 创建正则表达式
1.1 简单例子:
^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abc 匹 配 字 母 a b c 并 以 a b c 结 尾 , 匹配字母 abc 并以 abc 结尾, 匹配字母abc并以abc结尾, 为匹配输入字符串的结束位置。
1.2 非打印字符的转义序列:
1.3 特殊字符(一般使用反斜线 \ 转义字符):
1.4 限定符:
1.5 定位符:
1.6 预定义字符:
1.7 方括号表达式:
1.8 边界匹配符:
1.9 三种模式
- Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
- Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
- Possessive(占有模式):用加号后缀(+)表示,目前只有Java支持占有模式,通常比较少用。
String str = "hello , java!";
//贪婪模式的正则表达式
str.replaceFirst("\\w*"," ");
//勉强模式的正则表达式
str.replaceFirst("\\w*?"," ");
2 使用正则表达式
2.1 使用Pattern(样式)和Matcher(匹配)来使用正则表达式。
- Pattern对象是正则表达式编译后在内存中的表示形式。正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。
//字符串编译为Pattern对象
Pattern p = Pattern.compile("a*b");
//利用Pattern对象创建对应的Matcher对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();//返回true
- 上面定义的Pattern对象可以多次重复使用。Pattern是不可变类,可供多个并发线程安全使用。
2.2 Matcher类提供几个常用方法:
find():返回目标字符串中是否包含与Pattern匹配的子串。
group():返回上一次与Pattern匹配的子串。
start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
end():返回上一次与Patterm匹配的子串在目标字符串中的结束位置加1。
lookingAt():返回目标字符串前面部分与Pattern是否匹配。
matches():返回整个目标字符串与Pattern是否匹配。
reset():将现有的Matcher对象应用于一个新的字符序列。
- 在Pattern、Matcher类的介绍中经常会看到一个CharSequence接口。简单地说,CharSequence代表一个各种表示形式的字符串。
2.3 找电话号码(程序示例):
public class FindGroup{
public static void main(String[] args){
//使用字符串模拟从网络上得到的网页源码
String str = "我想求购一本《疯狂Java讲义》,尽快联系我13500006666"
+"交朋友,电话号码是13611125565"
+"出售二手电脑,联系方式15899903312";
//创建一个Pattern对象,并用它建立一个Matcher对象
//该正则表达式只抓取13x和15X段的手机号
//实际要抓取哪些电话号码,只要修改正则表达式即可
Matcher m = Pattern.compile("( (13\\d) | (15\\d) ) \\ d(8)").matcher(str);
//将所有符合正则表达式的子串(电话号码)全部输出
while(m.find()){
System.out.println(m.group());
}
}
}
- 一旦找到对应子串,下次调用
find()
方法接着向下查找;带int参数的find()
方法将从该int索引处向下搜索。 start()
和end()
方法用于确定子串在目标中的位置。matcher()
和lookingAt()
方法有点像:matcher()
要求整个字符串和Pattern完全匹配才返回true;lookingAt()
只要以Pattern开头就会返回true;- reset() 方法可将现有的Matcher对象应用于新的字符序列。
- Matcher类提供的
replaceAll()
方法把字符串中所有与正则表达式匹配的子串替换成“xxx”;Matcher类还提供一个replaceFirst()
方法,只替换第一个匹配子串。 - String类中也提供了
replaceAll()、replaceFirst() 、split()
等方法。
2.4 在线工具
- 不会写可以使用,正则表达式:在线工具 提供帮助,并且其还提供许多常用的正则表达式,可以到网站直接粘贴使用。