RegExp正則校驗之Java及R測試


 

前言

  正則表達式(英語: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}

mn均為非負整數,其中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測試結果:

 

結語:

  正則表達式可深可淺。在我看來,其重大作用主要也就是三方面,一是“校驗”,二是數據抓取,三是全局定位替換。以上內容只是本人在近期學習中的部分整理。同時也希望為其它需要了解正則表達式的朋友提供一絲參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM