RegExp正則校驗之Java及R測試

jopen 9年前發布 | 13K 次閱讀 RegExp

前言

正則表達式(英語:Regular Expression原 屬于計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里邊,正則表達式通常被用來檢索、替 換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,Perl,Shell,R,Java等等。

因本人最近剛好在學習R語言進行網頁數據抓取,覺得有必要對正則表達式做個小總結,于是便有了此文。

1.重要元字符及其簡短描述

元字符

</td>

描述

</td> </tr>

\

</td>

將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,“\\n”匹配\n“\n”匹配換行符。序列“\\”匹配“\”“\(”則匹配“(”。即相當于多種編程語言中都有的轉義字符的概念。

</td> </tr>

^

</td>

匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”“\r”之后的位置。

</td> </tr>

$

</td>

匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”“\r”之前的位置。

</td> </tr>

*

</td>

匹配前面的子表達式任意次。例如,zo*能匹配“z”“zo”以及“zoo”*等價于{0,}

</td> </tr>

+

</td>

匹配前面的子表達式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”+等價于{1,}

</td> </tr>

?

</td>

匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”“does”中的“do”?等價于{0,1}

</td> </tr>

{n}

</td>

n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o

</td> </tr>

{n,}

</td>

n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o“o{1,}”等價于“o+”“o{0,}”則等價于“o*”

</td> </tr>

{n,m}

</td>

mn均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o“o{0,1}”等價于“o?”。請注意在逗號和兩個數之間不能有空格。

</td> </tr>

?

</td>

當該字符緊跟在任何一個其他限制符(*,+,?{n}{n,}{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”“o+?”將匹配單個“o”,而“o+”將匹配所有“o”

</td> </tr> </tbody> </table>

 

2.常見正則校驗:

var regexEnum =

{

intege:"^-?[1-9]\d*$", //整數

intege1:"^[1-9]\d*$", //正整數

intege2:"^-[1-9]\d*$", //負整數

num:"^([+-]?)\d*\.?\d+$", //數字

num1:"^[1-9]\d*|0$", //正數(正整數 + 0)

num2:"^-[1-9]\d*|0$", //負數(負整數 + 0)

decmal:"^([+-]?)\d*\.\d+$", //浮點數

decmal1:"^[1-9]\d.\d|0.\d[1-9]\d$", //正浮點數

decmal2:"^-([1-9]\d.\d|0.\d[1-9]\d)$",//負浮點數

decmal3:"^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$",//浮點數

decmal4:"^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$",//非負浮點數(正浮點數 + 0)

decmal5:"^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$",//非正浮點數(負浮點數 + 0)

email:"^\w+((-\w+)|(\.\w+))\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)\.[A-Za-z0-9]+$", //郵件

color:"^[a-fA-F0-9]{6}$", //顏色

url:"^http[s]?:\/\/([\w-]+\.)+[\w-]+([\w-./?%&=]*)?$", //url

chinese:"^[\u4E00-\u9FA5\uF900-\uFA2D]+$", //僅中文

ascii:"^[\x00-\xFF]+$", //僅ACSII字符

zipcode:"^\d{6}$", //郵編

mobile:"^13[0-9]{9}|15[012356789][0-9]{8}|18[0256789][0-9]{8}|147[0-9]{8}$", //手機

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地址

notempty:"^\S+$", //非空

picture:"(.*)\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //圖片

rar:"(.*)\.(rar|zip|7zip|tgz)$", //壓縮文件

date:"^\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}$", //日期

qq:"^[1-9][1-9][0-9]$", //QQ號碼

tel:"^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$", //電話號碼的函數(包括驗證國內區號,國際區號,分機號)

username:"^\w+$", //用來用戶注冊。匹配由數字、26個英文字母或者下劃線組成的字符串

letter:"^[A-Za-z]+$", //字母

letter_u:"^[A-Z]+$", //大寫字母

letter_l:"^[a-z]+$", //小寫字母

}</pre>

3.實例測試

#-----R測試--------

=======正則驗證測試

pattern="^\w+((-\w+)|(\.\w+))\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)\.[A-Za-z0-9]+$";

list<-c("test@.cn","_3311@126.com","812344298@qq.com","test@321.com");print(list)

lists<-paste(list,collapse = ',');print(lists)

--grep()返回符合的元素下標;grep1()返回所有元素的布爾值

grep(pattern,list)

grepl(pattern,list)</pre>

R測試結果:

 RegExp正則校驗之Java及R測試

 

//----Java測試---------

package com;

import java.util.regex.*;

/**

  • java正則表達式驗證

*/

public class RegExpTest

{

/** 

 * 正則驗證方法一 

 */ 

public static boolean regExpTest(String input) { 

    //驗證標識符必須由字母、數字、下劃線組成 

    Pattern p = Pattern.compile("[a-z0-9A-Z_]+"); 

    Matcher m = p.matcher(input); 

    return  m.matches(); 



}    

/** 

 * 正則驗證方法二 

 */ 

public static boolean regExpEmail(String input){

 //驗證個人定義的郵箱

 String regex = "^[a-zA-Z0-9]+@[0-9a-z]{2,4}+\\.+[a-z]{2,4}$";

 return  Pattern.matches(regex, input);

}

public static void main(String[] args) 

{ 

 System.out.println(regExpTest("root10086"));

 System.out.println(regExpEmail("847421525@qq.com"));

 System.out.println(regExpEmail("_te132@139.com"));      

}   

}</pre>

Java測試結果:

 RegExp正則校驗之Java及R測試

結語:

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

以上內容純屬個人學習總結,不代表任何團體或單位。若有理解不到之處請見諒!
來自:http://www.cnblogs.com/SeaSky0606/p/4592164.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色