1. 程式人生 > >程式碼學習--常用的正則表示式

程式碼學習--常用的正則表示式

學習內容

        工作程式碼中遇到了正則表示式,用於匹配輸入的指令格式是否梳理一下,一邊學習。

例子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,}"

[^/] 表示匹配非/的字元

後面的就沒有分割指令了,都是批量匹配