程式碼學習--常用的正則表示式
學習內容
工作程式碼中遇到了正則表示式,用於匹配輸入的指令格式是否梳理一下,一邊學習。
例子1 pid輸入格式匹配
指令格式
pid是沒有包含字母和中文的字串,比如:pid=12345
正則表示式
Pattern pattern = Pattern.compile("^\\S+[a-z A-Z]|[\u4e00-\u9fa5]$"); Matcher matcher = pattern.matcher(pid); if(!matcher.find()) { //PID中沒有字母,中文
這裡的pid,是String pid;
^ 匹配輸入字串開始的位置
\S 匹配任何非空白字元。
\s 匹配任何空白字元,包括空格、製表符、換頁符等等
+ 匹配前面的子表示式一次或多次。要匹配 + 字元,請使用 \+
* 匹配前面的子表示式零次或多次,如a*b匹配aaaaaab,返回true
[a-z A-Z] 匹配字母
[\u4e00-\u9fa5] 匹配中文
[0-9] 匹配數字
注意:Pattern和Matcher
Pattern類用於建立一個正則表示式,也可以說是匹配一個正則表示式(如上),由於類的構造器是私有的,不可直接建立,所以通過簡單工廠方法
Pattern pattern = Pattern.commpile(String regex); //建立一個正則表示式
Matcher類用於匹配正則表示式,Matcher類構造器也是私有的,不可直接創捷,所以通過呼叫
Matcher matcher = Pattern.compile(String input); //匹配正則表示式
常用:matcher.find()返回一個boolean判斷資料是否匹配。
例子2 sd指令輸入格式匹配
指令格式
sd:1/y/1
正則表示式(只匹配冒號後面的字元)
[0-9]{1,2}/[a-zA-z]{1}/[0-9]{1,2}
[0-9]{1,2}/[a-zA-z]{1}/[0-9]{1,2}
{n}:匹配確定的n次
{n,}:匹配至少n次
{n,m}:匹配至少n次,最多2次
上面兩個正則表示式匹配例項
12/y/12或者1/y/1等
12y12或者1y1等
例子3 匹配CG指令格式
指令格式:
CG:3U8884/12JUN128/CTU
正則表示式(只匹配了冒號後面的字元):
".{5,6}/.{1,}/[a-zA-Z]{3}"
.:表示匹配任意一個字元
例子4 匹配航班號指令格式
航班格式:CA1234,3U8888等
正則表示式:由於要匹配字母或者數字,分為兩部分來匹配
[a-z A-z 0-9]{2,}[0-9]{4,}
例子5
指令 : 3U8888/29JUN18YPEK-10;20
表示式 : [a-z A-Z 0-9]{5,7}/[a-zA-Z0-9]{10,12}-[0-9]{1,}([;][0-9]{1,})?$
指令:3U8888/29JUN18YPEK-10;20;30;20;1....
表示式:^[a-z A-Z 0-9]{5,7}/[a-zA-Z0-9]{10,12}-[0-9]{1,}([;][0-9]{1,})+$
?:匹配前面的子表示式零次或一次.
+:匹配前面的子表示式一次或者多次
從上面的表示式我們可以看到:([;][0-9]{1,})? 表示 ()裡面得表示式匹配0或者1次;+就可以匹配無限多了
例子6 匹配hbpw格式
cmd =HBPW:"3U8888/31JUL18FPEK1,BLND,DEAF,PSM,UM,INF,WCHR,WCBD,SPML";
regex=".{5,}/[^/]{1,}[,]{1,}[0-9a-zA-Z\u4e00-\u9fa5]{1,}"
[^/] 表示匹配非/的字元
後面的就沒有分割指令了,都是批量匹配