1 什么是正则语言
正则语言是一种特殊的上下文无关语言,它能够被DFA与NFA所识别,简化之后可以表达为一个产生式而不包含任何非终止节点。java提供了两个很强大的工具Pattern和Matcher来帮助我们使用正则表达式来处理一些问题。
2 Pattern
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
3 Matcher
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例。
4 Pattern与Matcher的配合使用
我们通过下面这个例子来说明一种Pattern与Matcher的使用方法。在该例子中我们要读取某一类给定格式的字符串(在这里我就使用str来代表这一类给定格式的字符串),并从中获取人名与日期的信息。在构造正则表达式前我们要先分析字符串的组成,字符串一共由三部分组成:由大小字母组成的人名、由数字和'-'组成的xxxx-xx-xx格式的日期和一对花括号,接下来我们逐个分析这三部分的识别方法。
第一部分我们用[a-zA-Z]+来识别,在正则表达式中[a-zA-Z+]代表至少生成a-z,A-Z中的一个字符。
第二部分我们用\d+来识别,\d是正则表达式中的转义字符,代表生成一个数字(当然也可以像生成字母一样使用[0-9]来生成数字),由于java中的特殊性所以在构造时要在\d前在加一个'\',这表示着告诉java解释器接下来输入的是一个转义字符。
第三部分我们用简单的'{','}'就可以,为了保险起见我们在每个花括号前都加上两个双斜杠,这表示我们要识别的确实就是一个花括号并没有其他的意思。
至此我们的正则表达式就构造完成了。
String str="ZhangSan{2021-01-10}";
Pattern s=Pattern.compile("([a-zA-Z]+)\\{(\\d+)-(\\d+)-(\\d+)\\}");
Matcher m=s.matcher(str);
String name=null;
String year=null;
String month=null;
String day=null;
if(m.find()){
name=m.group(1);
year=m.group(2);
month=m.group(3);
day=m.group(4);
}
当然细心的你肯定会发现在上面代码中的正则表达式里出现了'(',')',接下来我们就来说明'(',')'的作用。在Matcher类里提供了Matcher.group(int i)的方法,这里的i就代表着识别到的字符串里子串的组号,而小括号就起着分组的作用。这里还需要注意一点组号0代表着识别的整个字符串,子串的标号是从1开始的,就拿我们前面举得这个例子来说,ZhangSan是m.group(1),2021是m.group(2)。Matcher.find()方法对字符串进行匹配,匹配到的字符串可以在任何位置。至此我们就得到了字符串str中所有我们想要的信息:人名name,年year,月month和日day。