正则表达式中的贪婪模式与懒惰模式---以匹配xx开头xx结尾的字符串为例

以正则表达式匹配以xx开头以xx结尾的字符串为例


正则表达式是字符串处理的一大神兵利器,可以很方便的帮我们判断字符串是否符合规则和获取匹配到的结果,减少我们的重复的处理数据。
​ 博主在开发中,需要将硬件设备采集到的数据进行获取,一条数据已bb开头,以7e结束,硬件发送来的数据可能包含多条,我们需要将数据截取出来,放入到一个List中。简单的使用String的subString方法,一个个的截取也是可行的,不过这样写不能满足自己,因此就使用到了正则表达式。
最开始时,正则表达式如下:

bb\S*7e

但是,这样会导致一些问题,比如说接收到了两条数据,数据形为:bb022b32ffbbc7c17ebb02220011cb17e,我们的表达式会将所有的数据匹配为一条数据,结果如下图所示,这是因为*符号导致的,这让我们的正则匹配变成了贪婪模式,虽然中间也出现了一次7e,但是被\S匹配为了字母,导致两条数据匹配为一条。
贪婪模式
上面讲到的是正则匹配中的贪婪模式,明显对我们来说是不适用的,对于我们的场景,所需的是另一种相对的匹配模式,那就是懒惰模式,只要出现了7e,就应当将数据截取,而不是再去匹配\S,因此,正则表达式为:

bb\S*?7e

这里比较关键的就是?符号,当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n},{n,m})后面时,匹配模式是非贪婪的,也就是懒惰模式,该模式尽可能少地匹配所搜索的字符串。该正则表示的匹配结果如下图所示:

懒惰模式
这样,就完美的解决了我们的需求,下面给出Java的测试代码:

@Test
public void getRFIDdata() {
	String datastr = "bb022b30004e010207c17ebb0223050607089fffffbbc7c17e";
	Pattern rfidPattern = Pattern.compile("bb\\S*?7e");
	Matcher matcher = rfidPattern.matcher(datastr);
	while (matcher.find()) {
		System.out.println(matcher.group());
	}
	System.out.println(result);
}

博客到这里也就结束了,如果大家有什么疑问,可以评论留言,如果有不同意见,也可以留言讨论。原创不易,如果本文对你有帮助,还请留下个赞。

发布了27 篇原创文章 · 获赞 212 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34666857/article/details/101716732