前言:
正则表达式(英语: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.常见正则校验:
代码语言:javascript复制 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.实例测试
代码语言:javascript复制
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测试结果:
代码语言:javascript复制 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测试结果:
结语:
正则表达式可深可浅。在我看来,其重大作用主要也就是三方面,一是“校验”,二是数据抓取,三是全局定位替换。以上内容只是本人在近期学习中的部分整理。同时也希望为其它需要了解正则表达式的朋友提供一丝参考。