javaee论坛

普通会员

225648

帖子

324

回复

338

积分

楼主
发表于 2019-11-01 21:04:12 | 查看: 594 | 回复: 1

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

bb\S*7e

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

bb\S*?7e

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

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

@TestpublicvoidgetRFIDdata(){Stringdatastr="bb022b30004e010207c17ebb0223050607089fffffbbc7c17e";PatternrfidPattern=Pattern.compile("bb\\S*?7e");Matchermatcher=rfidPattern.matcher(datastr);while(matcher.find()){System.out.println(matcher.group());}System.out.println(result);}

普通会员

0

帖子

293

回复

301

积分
沙发
发表于 2019-12-22 03:07:24

看看

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017