转载

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}

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 测试结果:

RegExp正则校验之Java及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 测试结果:

RegExp正则校验之Java及R测试

结语:

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

正文到此结束
Loading...