前言:
正則表達式(英語:Regular Expression)原屬於計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里邊,正則表達式通常被用來檢索、替換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,Perl,Shell,R,Java等等。
因本人最近剛好在學習R語言進行網頁數據抓取,覺得有必要對正則表達式做個小總結,於是便有了此文。
1.重要元字符及其簡短描述
元字符 |
描述 |
\ |
將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當於多種編程語言中都有的“轉義字符”的概念。 |
^ |
匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。 |
$ |
匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。 |
* |
匹配前面的子表達式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等價於{0,}。 |
+ |
匹配前面的子表達式一次或多次(大於等於1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。 |
? |
匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。 |
{n} |
n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
{n,} |
n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。 |
{n,m} |
m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。 |
? |
當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
2.常見正則校驗:
1 var regexEnum = 2 3 { 4 5 intege:"^-?[1-9]\\d*$", //整數 6 7 intege1:"^[1-9]\\d*$", //正整數 8 9 intege2:"^-[1-9]\\d*$", //負整數 10 11 num:"^([+-]?)\\d*\\.?\\d+$", //數字 12 13 num1:"^[1-9]\\d*|0$", //正數(正整數 + 0) 14 15 num2:"^-[1-9]\\d*|0$", //負數(負整數 + 0) 16 17 decmal:"^([+-]?)\\d*\\.\\d+$", //浮點數 18 19 decmal1:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$", //正浮點數 20 21 decmal2:"^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$",//負浮點數 22 23 decmal3:"^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$",//浮點數 24 25 decmal4:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$",//非負浮點數(正浮點數 + 0) 26 27 decmal5:"^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$",//非正浮點數(負浮點數 + 0) 28 29 email:"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //郵件 30 31 color:"^[a-fA-F0-9]{6}$", //顏色 32 33 url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //url 34 35 chinese:"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$", //僅中文 36 37 ascii:"^[\\x00-\\xFF]+$", //僅ACSII字符 38 39 zipcode:"^\\d{6}$", //郵編 40 41 mobile:"^13[0-9]{9}|15[012356789][0-9]{8}|18[0256789][0-9]{8}|147[0-9]{8}$", //手機 42 43 ip4:"^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$", //ip地址 44 45 notempty:"^\\S+$", //非空 46 47 picture:"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //圖片 48 49 rar:"(.*)\\.(rar|zip|7zip|tgz)$", //壓縮文件 50 51 date:"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$", //日期 52 53 qq:"^[1-9]*[1-9][0-9]*$", //QQ號碼 54 55 tel:"^(([0\\+]\\d{2,3}-)?(0\\d{2,3})-)?(\\d{7,8})(-(\\d{3,}))?$", //電話號碼的函數(包括驗證國內區號,國際區號,分機號) 56 57 username:"^\\w+$", //用來用戶注冊。匹配由數字、26個英文字母或者下划線組成的字符串 58 59 letter:"^[A-Za-z]+$", //字母 60 61 letter_u:"^[A-Z]+$", //大寫字母 62 63 letter_l:"^[a-z]+$", //小寫字母 64 65 } 66 67
3.實例測試
1 #-----R測試-------- 2 3 #=======正則驗證測試 4 5 pattern="^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$"; 6 7 list<-c("test@.cn","_3311@126.com","812344298@qq.com","test@321.com");print(list) 8 9 lists<-paste(list,collapse = ',');print(lists) 10 11 12 13 #--grep()返回符合的元素下標;grep1()返回所有元素的布爾值 14 15 grep(pattern,list) 16 17 grepl(pattern,list)
R測試結果:
1 //----Java測試--------- 2 3 package com; 4 5 import java.util.regex.*; 6 7 /** 8 9 * java正則表達式驗證 10 11 */ 12 13 public class RegExpTest 14 15 { 16 17 /** 18 19 * 正則驗證方法一 20 21 */ 22 23 public static boolean regExpTest(String input) { 24 25 //驗證標識符必須由字母、數字、下划線組成 26 27 Pattern p = Pattern.compile("[a-z0-9A-Z_]+"); 28 29 Matcher m = p.matcher(input); 30 31 return m.matches(); 32 33 34 35 } 36 37 /** 38 39 * 正則驗證方法二 40 41 */ 42 43 public static boolean regExpEmail(String input){ 44 45 //驗證個人定義的郵箱 46 47 String regex = "^[a-zA-Z0-9]+@[0-9a-z]{2,4}+\\.+[a-z]{2,4}$"; 48 49 return Pattern.matches(regex, input); 50 51 } 52 53 public static void main(String[] args) 54 55 { 56 57 System.out.println(regExpTest("root10086")); 58 59 System.out.println(regExpEmail("847421525@qq.com")); 60 61 System.out.println(regExpEmail("_te132@139.com")); 62 63 } 64 65 }
Java測試結果:
結語:
正則表達式可深可淺。在我看來,其重大作用主要也就是三方面,一是“校驗”,二是數據抓取,三是全局定位替換。以上內容只是本人在近期學習中的部分整理。同時也希望為其它需要了解正則表達式的朋友提供一絲參考。