前言
这是我第一次复习之前学的的正则表达式,以后说不定会有补充和再次的复习。
本文会复习正则表达式的知识点,并且会写几个不同编程语言环境下的使用方式。
介绍
正则表达式(Regular Expression)是用来匹配字符串的,我们可以用来写爬虫爬网页上的内容,老实说我最初想学这个就是想在e站上爬点h图 =。=
普通字符
首先,正则表达式里面的内容也是字符串,如果你在表达式里写了aA,那可以匹配到"1aAdAfa"中的"aA"。其中aA代表着它本来的意思,也就是两个普通字符。然而也有大量的字符被赋予全新的意义了。
元字符
说实话网上看到好多分类并且有好多平常用不到字符的这里就暂不写了(先看具体的可以去runoob上看),元字符就是有特殊意义的字符。
如果想让它恢复本来的意义,如"\d"的意思是匹配所有数字,"\\d"的意思是"\d"。
元字符 | 特殊含义 |
---|---|
^ | 以什么为开头 |
$ | 以什么为结尾 |
^$ | 合起来就是前后完全匹配内容 |
\d | 数字0-9(其实会转为字符) |
\w | 数字、字母、下划线 |
\s | 空格 |
\b | 字符与空格之间的位置 |
. | 任意字符(除\n和自身,自身要转义) |
\b | 字符与空格之间的位置 |
[] | 匹配该区间中任意字符:[0-9a-zA-Z_]同等于\w |
以下字符用来指正修饰以上字符 | |
* | 0-多个字符,如:a*,匹配a重复>=0次 |
+ | 1-多个字符,如:a+,匹配a重复>=1次 |
? | 0-1个字符,如:a?,匹配a重复0-1次 |
{m} | m个字符,如:a{10},匹配a重复10次 |
{m,} | m个字符,如:a{10,},匹配a重复大于10次 |
{m,n} | m-n个字符,如:a{0,1},效果等同于a? |
\D,\B,\S,\W | 与小写的反义 |
[^…] | 区间中非匹配…,如:^ [^ -]\d+$ ,匹配非负数 |
( ) | 将字符分组,分组里可以用|表达或的意思,如:(1|2|3) 等同于[123] |
注意:博主之前一直分不清楚\s和\b的区别,根据上面的介绍和一下的图可以更好的分辨。
练习
有一些博客提供了很好的例子,这里给出友情链接:
https://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html(写的很全)
https://www.cnblogs.com/zery/p/3438845.html(关于html的实战不错)
通过js使用正则表达式
js表达式用起来最舒服,这里介绍部分知识点
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var str="123";
//两种表达式写法
var reg1=new RegExp("\\d\\d\\d");//注意转义
var reg=/\d\d\d/;
//test方法判断是否匹配成功
console.log(reg1.test(str)); //true
console.log(reg.exec(str)); //Array [ "123" ]匹配字符,返回数组
console.log(str.match(reg)); //非全局模式下和exec效果一样,全局模式下返回所有匹配项
</script>
</body>
</html>
通过java使用正则表达式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* java环境下使用正则表达式
*
* @author Vision
*
*/
public class RegTest {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\d\\d\\d");// Pattern是模式类
Matcher matcher = pattern.matcher("123 233ade");// Matcher是匹配器
System.out.println(matcher.matches());// mathes是要完全匹配,不匹配返回false
// pattern.matches("\\d\\d\\d", "123 233ade");与上面三句等效
int index = 0;
while (matcher.find()) {// find(int)可以指定位置
System.out.println(index + " " + matcher.group());// group返回以前匹配的序列
index++;
}
}
}
结果:
通过python使用正则表达式
# coding=utf-8
# 通过py使用正则表达式
import re
# 预先编译
# com=re.compile(r'^(\d{3})\s(\d{3})([a-z]{3})')
# com.match('123 233ade')
# 与上两句等效
m = re.match(r'^(\d{3})\s(\d{3})([a-z]{3})', '123 233ade')
if (m):
print("true") # true
# 分组
print(m.groups()) # 所有分组('123', '233', 'ade')
print(m.group(0)) # 原始字符串 123 233ade
print(m.group(1)) # 第一个:123
print(m.group(2)) # 第二个:233
print(m.group(3)) # 第三个:ade
# split与正则表达式
str = 'a, dd:e hh'
print(re.split(r'[,\s:]+', str)) # ['a', 'dd', 'e', 'hh']
总结
这里复习了一下正则表达式,写了一些常用的东西,看了一下别人的博客感觉自己要学的东西还有很多啊。