正则表达式 入门级学习
begin enjoy👇

一、 正则表达式

1.历史起源

正则表达式(以下简称“正则”)的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。

1956年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表的论文使用了正则表达式。正则表达式的第一个实用程序就是 Unix 中的 qed 编辑器。现在 绝大多数编辑器和IDE都支持对文件内容执行正则查找和替换。

2.正则概述

正则表达式,又称规则表达式。英语:Regular Expression,描述了一种/类字符串匹配的模式,在代码中常简写为reg,regex。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

(可以用来检查一段内容中是否含有某种子串、将匹配的子串做替换或者从内容种取出符合条件的子串等。)

正则表达式就是筛子,帮助我们在网页上筛选我们想要的内容。

正则表达式本身是一门独立的技术,可以被大多数编程语言所使用 很多编程语言都内置了接口 用来支持正则的操作,如Javascript、PHP、Java。

3.应用场景

(1) 表单验证:验证字符的合法性,如邮箱是否合法,手机号是否合法等等。

(2) 信息过滤:如论坛帖子或者评论中的非法字符,例如 sql注入、js脚本注入、煽动性的言论。

(3) 信息采集(爬虫):收集别人网站上的内容,例如整页采集时 筛选出需求部分的信息。

二、 快速入门

1.用法用例

  • 手机号验证是否合法
  • 防XSS攻击:使用正则表达式过滤用户输入中的<script>代码片段


一次正则操作包含三个步骤:

① 准备数据:要执行正则的字符串

② 创建正则:设置要匹配内容的规则模式

③ 执行正则:对使用正则匹配到的内容执行不同的处理:检测是否有、获取匹配内容、替换匹配内容

正则表达式是由普通字符(例如字母、数字)以及特殊字符(元字符限定符等)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

2.创建正则

1) 字面量正则对象

基本语法:var 正则名称 = /正则表达式/匹配模式

var reg = //;//正则表达式 是一个对象 不能使用引号括起来""

2) 显式创建正则对象

正则是一个对象 就有它的构造器,RegExp。可以通过构造器生成一个正则对象 即正则表达式。


g:(global)全局搜索 reg.global是只读的属性

i:(ignoreCase)忽略大小写。reg.ignoreCase也是只读的属性

3) 两种方式的区别

在使用字面量定义的正则中,表达式只能是硬编码的字符串。也就是说其中的变量名不能被解析,因此当表达式中含有动态设置的内容时 需要显式地去创建正则对象。

3.执行正则

4) RegExp对象方法

var reg = new RegExp(str);

方法名 用法用例 说明
RegExp.prototype.test(str) reg.test(str) 匹配到返回true否则false
RegExp.prototype.exec(str) reg.exec(str) 返回匹配结果 数组形式

reg.test(str)

检测字符串是否含有指定模式的子串,如果找到则返回true,否则返回false;当设置全局查找时lastIndex指针位置会更新,保存下次匹配开始的位置。

reg.exec(str)

将正则用于一个字符串的执行 返回一个包含匹配到的值(整个表达式和引用部分)、索引位置、源字符串的数组,如果没有找到则返回null;当全局查找时 同样会更新指针。

5) String对象方法

除了正则对象本身的方法外,字符串对象的一些方法 也支持传入正则表达式参数,实现更为精准和高效的操作。字符串对象的操作都是一次性执行,执行完毕指针重新初始化。

var str = new String();

方法名 用法用例 说明
String.prototype.match(reg) str.match(reg) 返回所有结果的数组
String.prototype.search(reg) str.search(reg) 返回索引位置
String.prototype.replace(reg,new) str.replace(reg) 返回替换后的字符串
String.prototype.split(reg) str.split(reg) 返回分割的数组

str.search(reg)

查找指定模式的子字符在源字符串中第一次出现的位置(默认从0开始)或者查找第一个子串的位置,如果没有找到则返回-1;该方法不支持全局查找

if (str.search(reg) < 0) {  

//未找到和正则匹配的内容

}

str.match(reg)

查找匹配正则的元素,返回一个包含所有匹配字符(引用部分)以及字符索引的数组(形如reg.exec()方法执行结果),如果没有匹配到则返回null;当设置全局查找时,返回所有匹配字符的集合(不包含引用部分)。

str.replace(reg, new str | callable fn)

替换一个字符串中指定模式的子字符串,返回替换过后的新字符串。如果希望全局替换 需要设置成全局替换模式;该方法支持传入回调函数返回一个新值 用来实现精确替换。

  • 将CSS中 使用下划线定义的样式 转化成能在js中操作的驼峰命名

    如将CSS属性background-image-position转化成backgroundImagePosition

str.split(reg)

以指定的正则模式分割字符串,返回各个子串组成的数组,该方法默认全局执行,如果希望不区分大小写的操作 可以使用/i;

split经常用来将一个字符串转化成数组,和数组的join方法 互为逆运算。

三、 正则基本语法

关于正则使用时需要解决的几个问题:

(1)我们需要查什么(限定内容)

(2)我们需要查多少(限定数量)

(3)我们从哪儿查起(限定位置)

4.元字符

字符匹配符 用于匹配某个或某些字符,它们主要由元字符组成,包含多种类型的字符的统称。

//预置的用来匹配的字符串 包含各种字符内容

window.str = "1234567890abcde fHIJKLMN!@#$%^&*()[ ]{ }< >\\/'\":-_\n";

6) 字符簇[cu](查什么)

在正则表达式中,通过一对方括号**[ ]括起来的内容,我们称之为"字符簇",用来表示范围中的一个**。

[abcd] 匹配字母abcd中的任一字符

[1234] 匹配数字1234中的任一数字

[a-z] 匹配小写字母a-z中的任一字符

[A-Z] 匹配大写字母A-Z中的任一字符

[0-9] 匹配数字从0-9中的任一数字

[0-9a-z] 匹配数字0-9或小写a-z中的任一字符

[0-9a-zA-Z] 匹配数字0-9或字母a-z中的任一字符

注意:在字符簇中,^代表取反的含义

[^a-z] 匹配除a-z以外的任一字符

[^0-9] 匹配除0-9以外的任一字符

[^abcd] 匹配除字母abcd以外的任一字符

7) 语义字符(查什么)

\d : 匹配一个数字字符 [0-9] (decimal)

\D : 匹配一个数字字符 [^\d]

\w : 匹配包括下划线的任何单字符[0-9a-zA-Z_] 不包括空格,js中的变量范围还包括$

[\w$]+ 表示一个变量名组成(word)

\W : 匹配任何非单字符 [^\w]

\s : 匹配任何空白符,制表符(\t)、空格、换行(\n)、回车(\r)、换页(\f) [\t\n\r\f]

\S : 匹配任何非空白字符 [^\s]

. : 匹配除 "\n" 之外的任何单个字符,匹配所有的话 则使用(.|\n)

注意:我们可以用 [\w\W],[\d\D],[\s\S], 这几个组合来代替所有字符 也就是相当于".|\n"

8) 限定符(查多少)

限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

{n} 匹配确定的 n 次 {5}

{n, } 至少匹配n 次 {5,}

{n, m} 最少匹配 n 次且最多匹配 m 次 {5,10}

* 匹配前面的子表达式零次或多次0到多{0, } {0,} (可有可无)

+ 匹配前面的子表达式一次或多次 1到多 {1,} {1,} (一定有)

? 匹配前面的子表达式零次或一次 0或1{0,1} {0,1} (有或没有)

  • 匹配4位连续的数字 [0-9][0-9][0-9][0-9]=>\d\d\d\d=>\d{4}

  • 至少匹配6位字符 \w{6, }

  • 匹配至少4位至多8位连续的数字 \d{4, 8}

9) 定位符(从哪儿)

定位符可以将一个正则表达式固定在一行的开始或结束,也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。

^ 匹配输入字符串的开始位置

$ 匹配输入字符串的结束位置

\b 匹配一个单词边界border

\B 匹配非单词边界

如果^和$同时出现在正则表达式中,则是严格限定字符串的内容,而不是包含内容

/^1[^12]\d{9}$/ -> 13709237683

/1[^12]\d{9}/ -> abc13709237683def

  • 自定义trim函数,去除字符串头尾空白
  • 单词边界与非单词边界 注意:\b与\s的区别

查找“hello javascript, you are not java!”中的分词java

5.转义字符

对于正则中的特殊字符,如果只匹配字符本身,需要使用反斜杠 \ 转义,如:

\* \+ \? \[ \] \{ \} \( \) \. \/ \^ \$

6.选择匹配符 表达式组合

正则语法中 “|”管道符为选择匹配,可以匹配多个规则 并使用()创建组合

  • 匹配字符串"I'm learing language, hello javaEE&hello javascript!"中的hello javaEE或hello javascript的部分。

7.模式修正符

模式不是正则表达式的一部分,但是能够影响正则表达式的作用效果。

  • g:global 全局模式

  • i :ignoreCase, 忽略(大小写)

  • s:代表单行模式,把整个字符串当成一行来看待,js目前不支持单行模式

  • m:多行模式


posted @ Zycin (非转载 来自个人学习资料整理)