RegExp正则校验之Java及R测试

jopen 9年前

前言

正则表达式(英语: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.常见正则校验:

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]+$", //小写字母    }

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)

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"));              }       }

Java测试结果:

 RegExp正则校验之Java及R测试

结语:

正则表达式可深可浅。在我看来,其重大作用主要也就是三方面,一是“校验”,二是数据抓取,三是全局定位替换。以上内容只是本人在近期学习中的部分整理。同时也希望为其它需要了解正则表达式的朋友提供一丝参考。

以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!
来自:http://www.cnblogs.com/SeaSky0606/p/4592164.html