Java基礎——正則表達式
一、什麽是正則表達式
正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。
許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Uinx中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex、復數有regexps、regexes、regexen。
* 代表多個
?代表一個字符(可以有,可以無)
--圖書編號 要麽是5個數字,要麽是5個數字加上 - 4 個數字,比如 12345 或 12345-0001
var r =new==RegExp 對象的方法 -- test(str) 是否包含 -- exec(str) 對一個字符串進行搜索,返回一個數組,沒找到返回null -- compile 略 ==String 對象中與正則表達式有關的方法 --match 語法格式為 match(regExp) ,與 RegExp 對象的exec 方法類似,返回一個數組。 註意,傳給它的參數是一個 RegExp 對象,如果設置了全局標誌,它返回的數組內容和 RegExp.exec() 的返回有所不同。返回的數組裏面,是一個個的完整匹配,而不是象前者那樣,第一個是完整匹配,而其他的是一個個的子匹配結果 --search 語法為 search(regExp)返回第一個匹配的字符串的位置 --replace replace(regExp,replaceText) --split(regExp) 三、正則表達式語法 要靈活運行正則表達式,必須了解其中各種元字符的功能,元字符從功能上大致分為: 1.限定符 2.選擇匹配符 3.分組組合和反向引用符 4.特殊字符 5.字符匹配符 6.定位符 == 限定符 1) {n} 規定前面的必須出現n次 // \d{5}, a{5} 2) {n,} 規定前面的至少出現n次 // 註意 "至少" 這兩個字 3) {n,m} 規定出現次數在n 和 m 之間 //註意,不要亂加空格 (n 和 m 都包含) 4) + 規定前面出現的第一個字符或者是擴號擴起來的第一個序列 必須是一次,或多次 // \d+ -> 9 或 4567 zo+ 不匹配z 匹配 zo ,匹配 zoo 等效於 zo{1,} 5) * 前面出現的可以是任意次 zo* 匹配 z, 匹配 zo ,匹配 zoooo 等效於 zo{0,} 6) ? 前面的內容一次或零次 zo? 匹配 z , 匹配 zo , 不匹配 zoo, 等效於 zo{0,1} == 選擇匹配符 | , 二選一,盡量往大取 cat|dog nice ,匹配的是 cat 和 dog nice 附:(cat|dog) nice == 分組組合和反向引用符 分組組合符:將正則表達式中的某一部分內容組合起來的符號,反向引用符:用於匹配前面的分組組合所捕獲到的內容的標識符號 1) (pattern) 註意 要匹配字面意義的 ( ,要使用 \( 2) \num 這就是反向引用,用於匹配 num 所指定的特定緩沖區中的內容 例如 要匹配連續 5個相同的數字字符 要使用 (\d)\1{4} 3){?:pattern} 不會把 pattern 部分當作子匹配,主要用於那種必須過行組合,但又不想讓被組合的部分進行子匹配的情況,省緩沖區 例如 this is (a cat) 寫成 this is (?:a cat) 4) (?=pattern) 正向預測先行匹配 例如: windows (?=NT|2000) ,只於 windows 2000 或 windows NT 中的 windows匹配而不於 windows 2003 中的windows 匹配 ,註意它匹配的結果 只是windows部分。比如常見的應用 :將全文 windows 2000 或 windows NT 前面的 windows改寫成 win,就要用這個方式 replace(/^windows (?=NT|2000)$/,"win"); 註意: windows(?=NT|2000) cat ,在文本 My windows NT cat 中的匹配結果是多少,啥也匹配不著,因為它匹配的是 window cat 5) (?!pattern) 反向預測先行匹配 == 特殊字符 正則表達式中,以反斜框 \ 後緊根其他轉義字符序列來表示原意字符 1 \xn (這裏的n必須是兩位) \x41 匹配字符A \x04 的意義是 \x04 所給表示的字符後面緊根字符 1 2 \n 要求 n 是一個1位的8進制數 3 \nm mn都是一個一位的8過制數 4 \nml n是0-3之間的8進制數 5 \un 匹配unicode碼等於n的字符, 比如 \u00A9 匹配版權號 6 \cx 例如 \cM 匹配 Control+M 表示的控制字符,也就是回車符 7 \f 匹配換頁符 等效於 \x0a 和\cJ 8 \n 匹配回車符 等效於 \x0d 和\cM 9 \t 匹配制表符 等效於 \x09 和 \cl 10 \v 匹配垂直制表等 == 字符匹配符 1) [...] 匹配包含在其中的任意一個字符 例 [ABC] 匹配 A,B,C 中任意一個,註意,如果要包含 [ 要將它放在第一位 ,如果要包含 \ 要寫成 \\ 2) [^...] 和上面的相反,匹配沒有出現的任何字符 例 [^ABC] 只要不是A,或 B,或 C 就行 註意, ^一定要放在前面,否則它就是字面意義上的^ 3) [a-z] 匹配指定泛圍的 例如 [0-9] = \d 4) [^a-z] 匹配不在a-z之間的任意字符 5) \d 任意的數字字符 等效於 [0-9] 6) \D \d 逆運算 等效於 [^0-9] //逆運算都是大寫的 7) \s 匹配任何的空白字符 (space) 8) \S 是\s 的逆運算 9) \w 等效[a-zA-Z0-9_] 任意的大小寫字母,數字,下劃線 //註意它不匹配 - ,但匹配 _ 10) /W 是\w的逆運算 等效於[^a-zA-Z0-9_] 11) . 匹配除了 \n之外的任意字符,要匹配本身,用\.RegExp("\\d{5}"); 如果用要匹配 \ 怎麽辦? 要使用 \\\\ (四個) var r=/\d{5}/;
var setr="高睿說: 我我..下棋....很.很....厲害"; //第一次,去掉所有的. str=str.replace(/\./g,""); //第二次,去掉重復的字 str=str.replace(/(.)\1/g, "$1"); //結果 : 高睿說: 我下棋很厲害
== 定位符
1) ^ 規定匹配必須發生在目標字符串的開頭部分上,必須出現在最前面才有用
例如 ^o 與 ok中的 o 匹配,但於 dog 中的 o 不匹配,,如果設置了RegExp對象實例的
MultiLine 屬性, ^ 還會與首行匹配, 即與 \n 或 \r 之後的位置匹配
2) $ 匹配目標字符串的結尾位置,必須出現在最後才有定位符的作用
例如 o$ 與 hello 中的 o 匹配 ,但與 ok 中的 o不匹配
3) \b 匹配一個字(也就是一個單詞) 的邊界,它包含了字與空格間的位置以及目標字符串的開始和結束等位置
例如 "er\b" 匹配 never ok 中的er ,但不匹配 verx 中的er
"\bis\b" 匹配 this is anicecat isisisdog 中的 is
4) \B \b的逆運算 ,結果與上例相反
//例子
調用 replace(/win/g,"close") 來替換 win a window ,得到 close a closedow
調用 repalce(/\bwin\b,"close"/) 得到 close a window
//例子
如果想在一段文本的內容中的每行前面都加上同一個標記文本,只需使用這個標記文本對
^ 做全局替換即可
var str= "aaa\nbbb\nccc";
alert( str.replace(/^/mg,"#")); 這裏的m 指的是多行的意思
結果:
#aaa
#bbb
#ccc
== 附
---- 原義字符
一些元字符不在再表示它原來的字面意義,如果要匹配它們的字面意義,必須使用
\ 轉義
需要進行轉義的字符 $ ( * . [ ? \ / ^ { |
---- 優先級順序
* 比字符優先級高,比如 ab* 是 b 和 * 組合後,再和前面的 a組合
()比 *優先級高,(ab)* 是a和b組合後,再和* 組合,字符比 | 優先級高,
a|bc 是 bc組合後,再和 a 組合
一些正則表達式模式範例
匹配空行 /^\s*$/
匹配HTML標記 /<(\S+)(\s[^>]*)?>[\s\S]*<\/\1\s*>/
匹配email /^[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
匹配兩個相同相鄰的單詞 /\b([a-z]+)\1\b/ //例如 CatCat
匹配 ip 地址 /^\d{1,2}|1\d\d|2[0-4]\d|25[0-5](\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/
\u4e00-\u9fa5 表示中文
四、java 中使用正則表達式驗證
//例一 驗證手號碼 public static boolean checkPhone(String str){ boolean result=true; if(str.length()!=11){ result=false; System.out.println("號碼長度不正確"); } if(!str.startsWith("1")){ result=false; System.out.println("不是以1開頭的"); } char [] arr=str.toCharArray(); for(int i=0;i<arr.length;i++){ if(!(arr[i]>=‘0‘&&arr[i]<=‘9‘)){ result=false; System.out.println("含有非法字符"); break; } } return result; }
//例二 public static boolean checkPhone2(String str){ boolean result=true; try{ Long.parseLong(str); } catch(Exception ex){ System.out.println("手機號格式不正確"); result=false; } return result; }
// 例三 public static boolean checkPhone3(String str){ String regex="1[3584]\\d{9}"; return str.matches(regex); }
//例四 使用正則表達式進行切割 public static void splitDemo1(){ String str="aaa---bbb-------ccc----ddd"; String [] strList=str.split("-+"); System.out.println(strList.length); for(String s:strList){ System.out.println(s); } }
//例五 public static void splitDemo2(){ String str="aaa.bbb.ccc.ddd"; String [] strList=str.split("\\."); System.out.println(strList.length); for(String s:strList){ System.out.println(s); } }
//例六 public static void splitDemo3(){ String str="c:\\windows\\system32\\aa.bmp"; String [] strList=str.split("\\\\"); System.out.println(strList.length); for(String s:strList){ System.out.println(s); } }
//例七 替換 public static void replaceDemo(){ String str="要1234想辦456假證,請聯系13503688749或13302564798 或者是 15050020120 或者 257"; String regex="\\d{11}"; System.out.println(str.replaceAll(regex, "混球")); }
//例八 獲取 public static void getDemo(){ String str="林花謝了春紅大蔥蔥,太匆匆,好大大蔥大蔥蔥大蔥蔥蔥"; String regex="大蔥蔥+"; Pattern pattern=Pattern.compile(regex); Matcher matcher=pattern.matcher(str); while(matcher.find()){ System.out.println(matcher.group()); } }
//例九 從網頁上獲取 public static void webGetDemo()throws Exception { URL url=new URL("http://localhost:8080/book-shop/login.jsp"); URLConnection conn=url.openConnection(); BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); String regex="[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+"; Pattern pattern =Pattern.compile(regex); String str=null; while((str=br.readLine())!=null){ Matcher matcher=pattern.matcher(str); while(matcher.find()){ System.out.println(matcher.group()); } } }
Java基礎——正則表達式