Java正则表达式提取ESP8266返回的ssid信息

ESP8266是一个将wifi转换成串口通信协议的模块。使用其AT指令扫描wifi后,将返回一段携带AP信息的文字。如果需要从这段文字中提取出有用的信息,如ssid等,使用正则表达式提取是一个快速方便的方法。

所使用的上位机采用Java语言编写,且Java支持正则表达式的编译与匹配,且与使用简单的字符串判断相比,正则表达式语言简练,可调试性好,所以最终采用了正则表达式提取信息。

一、什么是正则表达式

正则表达式(英语:Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

二、正则表达式的调试工具RegexBuddy

RegexBuddy是一款正则表达式的调试软件,其带有正则表达式的编译和测试功能,并且可以将正则表达式复制为各个语言的字符串类型,可以很方便的转换字符串中不同语言支持的转义文本。

Java正则表达式提取ESP8266返回的ssid信息_第1张图片

Java正则表达式提取ESP8266返回的ssid信息_第2张图片

三、对文本的分析

从ESP8266传回的数据如下:

+CWLAP:(4,"NXP_1",-84,"bc:46:99:83:3f:40",1,28,0)
+CWLAP:(4,"NXP",-58,"8c:a6:df:64:c6:41",6,25,0)
+CWLAP:(4,"å哥联盟",-94,"fc:d7:33:db:97:1c",11,23,0)
+CWLAP:(0,"ChinaNet",-92,"84:74:2a:56:ff:28",11,8,0)
+CWLAP:(4,"225(2)",-92,"1c:60:de:11:8b:74",12,15,0)
+CWLAP:(4,"MERCURY_9DF0",-91,"8c:f2:28:19:9d:f0",13,23,0)

结构分析:

`+CWLAP:(加密方式,"ssid",信号强度,"MAC",?,?,?)`

根据这种结构就可以提取返回数据中的所有信息了。

四、正则表达式的使用

匹配普通文本

——-只需要将文本本身直接录入就可以匹配普通文本,效果图如下
——-Java正则表达式提取ESP8266返回的ssid信息_第3张图片

匹配任意文本

——-对单一字符的通配符是. ,对一段字符的通配符是*

匹配特殊文本

——-正则表达式匹配语法

匹配某一段文字之后的文本

——-不包含某一段文本,写作:(?<=某一段文本).*
——-包含某一段文本,写作:(?<某一段文本).*

匹配某一段文字之前的文本

——-不包含某一段文本写作:.*(?>=某一段文本)
——-包含某一段文本写作:.*(?>某一段文本)

匹配某两段文字之间的文本

——-如上两个所示,选用包含与不包含的运算符
——-例如:(?<=某一段文本).*(?>=某一段文本)

五、针对返回信息所选用的正则表达式

对“加密方式”

加密方式只选用以为数字来表示,所以只匹配左圆括号紧接着的数字即可,表达式为:(?<=\(). ,匹配效果如下:

Java正则表达式提取ESP8266返回的ssid信息_第4张图片

对“ssid”

ssid为加密方式后双引号里的内容,所以需要在上式的左匹配中加入加密方式本身的内容,并且需要加入右匹配的内容,表达式为:(?<=\(\d,").*?(?=")

对“信号强度”

信号强度前始终有负号,所以针对信号强度的匹配稍简单,但对ssid的特殊性,所以这里要小心ssid中含有的相同的符号。
我所采用的表达式为:(?<=(?<=\(\d,").*?(?=")",).*(?=,")

对“MAC”

正则表达式匹配MAC的方法在网上比较好找,因为其特征比较明显。表达式为([0-9a-zA-Z]{2}:){5}[0-9a-zA-Z]{2}

六、Java中的正则表达式的用法

Java中处理正则表达式使用的包为java.util.regex.Matcherjava.util.regex.Pattern ,它们分别用于编译表达式和匹配文本。
代码为:

String serialdata = "
    +CWLAP:(4,"NXP_1",-84,"bc:46:99:83:3f:40",1,28,0)
    +CWLAP:(4,"NXP",-58,"8c:a6:df:64:c6:41",6,25,0)
    +CWLAP:(4,"å哥联盟",-94,"fc:d7:33:db:97:1c",11,23,0)
    +CWLAP:(0,"ChinaNet",-92,"84:74:2a:56:ff:28",11,8,0)
    +CWLAP:(4,"225(2)",-92,"1c:60:de:11:8b:74",12,15,0)
    +CWLAP:(4,"MERCURY_9DF0",-91,"8c:f2:28:19:9d:f0",13,23,0)
";
//在上位机中serialdata用于存储上位机返回的文本。

//定义三种正则表达式
String ecn_regEx = "(?<=\\().(?=,\")";
String ssid_regEx = "((?<=\\(\\d,\").*?(?=\"))";
String mac_regEx = "([0-9a-zA-Z]{2}:){5}[0-9a-zA-Z]{2}";

//正则表达式编译
Matcher ecn_matcher = Pattern.compile(ecn_regEx).matcher(serialdata);
Matcher ssid_matcher = Pattern.compile(ssid_regEx).matcher(serialdata);
Matcher mac_matcher = Pattern.compile(mac_regEx).matcher(serialdata);

//输出所有匹配项
while(ecn_matcher.find()&&ssid_matcher.find()&&mac_matcher.find()){
    System.out.println(ecn_matcher.group(0)+ ssid_matcher.group(0)+ mac_matcher.group(0));
}

这里要注意,Matcherfind() 方法每执行一次只会进行一次匹配,返回值为匹配成功与否,所以需要使用循环才能匹配所有的返回值。

你可能感兴趣的:(Java)