正则表达式
前言:本篇博客将介绍正则表达式在Java中的应用,其他语言类似,正则表达式是一个共有的规则。
目录
一、概述
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE)正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。在众多语言中都可以支持正则表达式,如Perl、PHP、Java、Python、Ruby等。当然在Java中也可以通过调用相关API的方式达到检索,替换文本字符串的目的。但是有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的。
二、正则表达式规则
我们先览为快,看看正则表达式的匹配规则吧:
模式 | 描述 |
---|---|
\w | 匹配字母、数字、下划线 |
\W | 匹配非字母、数字、下划线 |
\s | 匹配任意空白字符,相当于[\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,相当于[0-9] |
\D | 匹配非数字的字符 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
. | 匹配任意字符,除了换行符 |
[^…] | 不在[]中的字符,比如[^abc]匹配除了a、b、c之外的字符 |
* | 匹配0个或多个表达式 |
+ | 匹配1个或多个表达式 |
? | 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式 |
() | 匹配括号内的表达式,也表示一个组 |
{n} | 精确匹配n个前面的表达式,比如\d{n},代表n个数字 |
{n,m} | 匹配n到m次由前面正则表达式定义的片段,贪婪方式 |
三、栗子说明
package com.houbo.shizhan;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex {
//匹配数字
public void regex1(){
String string = "9";
String regex = "[0-9]";
boolean flag = Pattern.matches(regex,string);
System.out.println(flag);
}
//匹配3到5个字母
public void reges2(){
String str = "hello";
String regex = "[a-zA-Z]{3,5}";
boolean matches = str.matches(regex);
System.out.println(matches);
}
//第一个数字是1,第二个数字是2,3,7,8任意一个,后面9位不包含4
public void regex3(){
String str = "13656231253";
String regex = "1[2378][0-35-9]{9}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
boolean matches = matcher.matches();
System.out.println(matches);
}
//把字母替换成$ 把数字替换成0
public void regexReplace(){
String str = "12a6B985Ccv65";
String regex = "[a-zA-Z]+";
String regex2 = "\\d+";
String s = str.replaceAll(regex, "$");
System.out.println(s);
String s1 = str.replaceAll(regex2, "0");
System.out.println(s1);
}
//按大写字母切割字符串
public void splite(){
String str = "oneTtowTthreeDfourJfive";
String regex = "[A-Z]";
String[] split = str.split(regex);
for (String s:split){
System.out.println(s+" ");
}
}
public static void main(String[] args) {
Regex re = new Regex();
re.regex1();
re.reges2();
}
/*贪婪匹配 .*
* 匹配中间数字,只能得到7
* 会尽可能多的匹配数据
*/
public void greedy(){
String s = "Hello 123 4567 World_This is a Regex Demo";
Pattern pattern = Pattern.compile("Hello.*(\\d+).*Demo");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println(matcher.group(1)); //匹配到的整个结果
}
}
/**
* 非贪婪模式 .*?
*/
public void fGreedy(){
String s = "Hello 123 4567 World_This is a Regex Demo";
Pattern pattern = Pattern.compile("Hello.*?(\\d+).*Demo");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println(matcher.group());
System.out.println(matcher.group(1));
}
}
}
贪婪模式:
content = 'aacbacdbc'
pattern = re.compile('ac.*?b')
result = re.findall(pattern,content)
print(result)
结果:
[‘acb’, ‘acdb’]
非贪婪模式:
content = 'aacbacbc'
pattern = re.compile('a.*?b')
result = re.search(pattern,content)
print(result.group())
结果:
aacb
总结
在java中调用正则表达式的类是java.util.regex.Matcher和java.util.regex.Pattern,java.util.regex包是从jdk1.4开始提供的。正则表达式让我们对于字符串处理更加灵活快捷。