正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是一个String对象的字符序列。
1. 元字符
字符序列中含有具有特殊意义字符,这些特殊字符称做正则表达式中的元字符。
它表示某一类字符,写法固定,下表是正则表达式的元字符:
2. 元字符表达式
使用中括号,实现运算。
[abc]: 代表a、b、c中的任何一个
[^abc]: 代表除了a、b、c以外的任何字符;
[a-zA-Z]: 代表英文字母(包括大写和小写)中的任何一个;
[a-d]: 代表a-d中的任何一个;
中括号里允许嵌套中括号,可以进行并、交、差运算,例如:
[a-d[m-p]]:代表a~d,或m~p中的任何字符(并);
[a-z&&[defl]:代表d、e或f中的任何一个(交);
[a-f&&[^bc]]:代表a、d、e、f (差)。
3. 限定符
表示出现的次数,如下图。
4.注意事项
(1) 由于"."代表任何一个字符,所以在正则表达式中如果想使用普通意义的点字符,必须使用[.]或\56表示普通意义的点字符。
(2) 若有些字符是固定的,则不需要使用元字符等,直接使用该字符即可。例如:匹配某个书名,书名号是固定的,则可以编写正则表达式为String regex = "《.*》"
5.测试正则表达式
(1) 判断某字符串是否符合要求的方法:matches,返回值是true或者false。
例如判断日期格式:
System.out.println("1997-11-09".matches("\\d{4}\\-\\d{2}\\-\\d{2}"));
System.out.println("1997/11/09".matches("\\d{4}\\-\\d{2}\\-\\d{2}"));
执行结果:
true
false
(2) 找出某文本中的所有符合规则的文本,可编写工具类如下:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexUtil {
public static List<String> findByRegex(String text,String regex) throws IOException
{
//正则表达式的编译表示形式(模式)
Pattern p = Pattern.compile(regex);
//通过解释 Pattern 对 字符序列执行匹配操作的引擎。 通过调用模式的 matcher 方法从模式创建匹配器。
Matcher m = p.matcher(text);
List<String> list = new ArrayList<String>();
//尝试查找所有与该模式匹配的序列
while(m.find()) {
String g = m.group();//得到匹配操作所匹配的输入子序列。
list.add(g);
}
return list;
}
}
测试主类:
public class Test {
public static void main(String[] args) throws IOException {
String text = "《钢铁是怎样炼成的》是前苏联作家尼古拉·奥斯特洛夫斯基所著的一部长篇小说,于1933年写成。\r\n" +
"小说通过记叙保尔·柯察金的成长道路告诉人们,一个人只有在革命的艰难困苦中战胜敌人也战胜自己,只有在把自己的追求和祖国、人民的利益联系在一起的时候,才会创造出奇迹,才会成长为钢铁战士。\r\n" +
"2020年4月,列入《教育部基础教育课程教材发展中心 中小学生阅读指导目录(2020年版)》初中段。";
System.out.println("文本示例:\n"+text);
//书名的正则
String regex = "《.*》";
//找到所有的书名
List<String> bookList = RegexUtil.findByRegex(text,regex);
//遍历输出
System.out.println("\n该文本的书名有:");
for(String book : bookList) {
System.out.println(book);
}
}
}
执行结果: