软件构造-正则表达式

本文介绍了Java中正则表达式如何用于解析字符串,包括正则语言的概念、Pattern类和Matcher类的使用。通过示例展示了如何从给定格式的字符串中提取人名和日期信息,讲解了括号在正则表达式中的分组作用,并演示了Matcher的find()方法。
摘要由CSDN通过智能技术生成

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值