java中的正则表达式
正则表达式不属于任何语言,所以这里只是介绍java中使用正则表达式的类。具体正则表达式规则可以到 菜鸟教程 查看
“https://www.runoob.com/java/java-regular-expressions.html”
正则表达式的匹配查找
这里以一个字符串中的ip端口号查找为例
public static void main(String[] args) {
String cell = "plc控制内容[提/192.168.7.100:8080][提/192.168.7.101:8081][提/192.168.7.102:8082]故意添加的后缀"; //字符串的内容
String pattern = "\\[提/(?<ip>\\d{3}\\.\\d{3}\\.\\d{1,3}\\.\\d{3})\\s*\\:\\s*(?<port>\\d{1,5})]"; //正则表达式
/**
* 解释一下
* [] 是正则表达式中的特殊符号,所以 开头的 [ 需要用 \ 进行转义,然而\又是java的特殊字符所以要先给 \进行转义,最终写成了 \\[
* 规则是 内容都是以 “[提/ ”开头,以“] ”结尾的,ip和端口号之间用 “:”分割
* ip格式是 三位数字.三位数字.三位数字.三位数字 ,端口号最大 65535
* 所以 ip的是 \\d{3}\\.\\d{3}\\.\\d{1,3}\\.\\d{3} 端口是 \\d{1,5} 。\d表示匹配数字 {3}表示匹配三个 \.表示匹配一个点,因为 .是特殊字符所以写成 \.
* \在java中是特殊字符,所以要再多写一个 \
* 这里主要解释一下 () ?<字符>; 一个()代表一个group,?<字符> 中的字符可以当作获取组中值时的key
*/
Pattern compile = Pattern.compile(pattern); //构建正则
Matcher matcher = compile.matcher(cell); //字符串的匹配
/**
* 构建完正则就可以进行 匹配了。这里主要是find()方法,可以想向根据写好的正则表达式,上面字符串最终匹配到的应该是
* [提/192.168.7.100,8080]
* [提/192.168.7.100,8080]
* [提/192.168.7.100,8080]
* 三个部分,而执行 find()方法会一次往后查找, 可以当作集合中 iterator中的 hasNext()方法,每次执行下标往后移,直至匹配不到。
*/
while (matcher.find()){ //每次执行find()方法,都会将搜索 表达式中下一个匹配到的 ()中的正则表达式,
/**
* 这里就可以通过group()方法进行组值查找了
* 比如我写的是 (?<ip>\d{3}\.\d{3}\.\d{1,3}\.\d{3})\s*\\:\s*(?<port>\d{1,5})
* 其中 \s* 执行为了匹配ip和端口之间的 : 前后 空格,换行等符号
* ip当作key,那么value就是紧跟其后的匹配规则,多个组用 ()进行分割,这里就是
* (?<ip>\d{3}\.\d{3}\.\d{1,3}\.\d{3}) 一个组
* (?<port>\d{1,5}) 一个组
*/
System.out.println(matcher.group("ip")); //这里的ip是 正则表达式中对应 ()中的 ?<ip>中的ip字符
System.out.println(matcher.group("port")); //这里的ip是 正则表达式中 ()中的 ?<ip>中的port字符
}
}
最终打印结果
192.168.7.100
8080
192.168.7.101
8081
192.168.7.102
8082
Process finished with exit code 0