js正则表达式笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_27984879/article/details/86582334

什么是正则表达式

  • Regular Expression使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
  • 说简单了就是按照某种规则去匹配符合条件的字符串

通配符

查找当前目录下的所有txt后缀文件

.find ./ -name *.txt

REGEXPER

正则表达式可视化工具

选择数字

\d 表示数字

选择数量

大括号表示数量

{4} 表示循环4

判断

中括号表示或者

[/-] 选择/或者-

开头

^表示开头

结尾

$表示结尾

选择区域

小括号选择的区域可以用&(number)来表示

^(\d{4})[-\](\d[4})[-\](\d{4})&

&1 = 第一个 \d{4}
&2 = 第二个 \d{4}
同理.

实例化正则表达式

JavaScript通过内置RegExp支持正则表达式
有两种方法实例化RegExp对象

  • 字面量
  • 构造函数

字面量

用变量保存正则运算

var reg = /\bis\b/g;
replace()

replace()函数用来替换字符串
要替换的字符串.replace(正则表达式,替换的字符串)

var reg = /\bis\b/;
'He is a boy.This is a dog.Where is she?'.replace(reg,'IS');
会将字符串中 第一个 小写的is替换成大写的IS
全局搜索

加入g可以在全文进行搜索

var reg = /\bis\b/g;
'He is a boy.This is a dog.Where is she?'.replace(reg,'IS');
会将字符串中 所有的 小写的is替换成大写的IS

构造函数

使用var 变量 = new RegExp()来调用构造函数

修饰符

  • g : global 全文搜索(默认只搜索第一个)
  • i : ignore case 忽略大小写(默认大小写敏感)
  • m : multiple lines 多行搜索

元字符

正则表达式由两种基本字符类型组成:

  • 原义文本字符
  • 元字符

元字符是正则表达式中有特殊含义的非字母字符

* + ? $ ^ . | () {} []
字符 含义
\t 水平制表符
\v 垂直制表符
\n 换行符
\r 回车符
\r 空字符
\f 换页符
\cX 与X对应的控制字符(Ctrl+X)

字符类

  • 一般情况下正则表达式一个字符对应字符串一个字符

字符类取反

  • 使用元字符^创建反向类/负向类
  • 反向类的意思是不属于某类的内容
[^abc] 表示不是字符a或b或c的内容

范围类

我们可以使用 [a-z] 来连接两个字符表示从a到z的任意字符

  • 这是个闭区间,包含a和z本身
  • 在 [ ] 组成的类内部是可以连写的 [a-zA-Z]

预定义类

预定义类来匹配一些常用的字符

字符 等价类 含义
. [^\r\n] 除了回车符合换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白符
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母、数字下划线)
\W [^a-zA-Z_0-9] 非单词字符

边界

常用的边界字符

字符 含义
^ 以xxx开始
$ 以xxx结束
\b 单词边界
\D 非单词边界

量词

字符 含义
出现零次或一次(最多出现一次)
+ 出现一次或多次(至少出现一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

贪婪模式

正则表达式在默认情况下会尽可能多的匹配
在量词后加问号可以选择非贪婪模式
也就是说一旦成功匹配则不再继续尝试

分组

使用小括号来进行分组,可以是量词作用于分组

可以使用|来达到或的效果

反向引用

$(number)可以捕获到分组的内容

忽略分组

只需要在分组内加上?:就可以

(?:book).(ok)

前瞻

  • 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”
  • 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后詹方向相反
  • JavaScript不支持后顾
  • 符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配
名称 正则 含义
正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)

对象属性

  • global: 是否全文搜索,默认false
  • ignore case:是否大小写敏感,默认是false
  • multiline:多行搜索,默认值是false
  • lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置
  • source:正则表达式的文本字符串

正则表达式方法

RegExp.prototype.test(str)

  • 用于测试字符串参数中是否存在匹配正则表达式模式的字符串
  • 如果存在则返回true,否则返回false
var reg = /\w/;
reg.test('a');
返回true
var reg = /\w/g;
reg.test('a');
返回true
第二次执行则会返回false
因为lastIndex属性默认每次运行会跳转到下个字符
第三次执行会返回ture
因为会把lastIndex属性返回到0

所以test方法一般不用全局参数

RegExp.prototype.exec(str)

  • 使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象属性以反映匹配结果
  • 如果没有匹配的文本则返回null,否则返回一个结果数组:
    • index 声明匹配文本的第一个字符的位置
    • input 存放被检索的字符串string
非全局调用
  • 调用非全局RegExp对象的exec()时,返回数组
  • 第一个元素时与正则表达式相匹配的文本
  • 第二个元素时与RefExpObject的第一个子表达式相匹配的文本(如果有的话)
  • 第三个元素时与RefExp对象的第二个子表达式相匹配的文本(如果有的话)
  • 以此类推

Srting.protatype.search(reg)

  • search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
  • 方法返回第一个匹配结果 index,查找不到返回-1
  • search()方法不执行全局匹配,他将忽略标志g,并总是从字符串的开始进行检索
搜索字符串
'a1a2a3'.search('1');
搜索正则表达式
'a1a2a3'.search(/\w\d/);
如果不是正则或是字符串,会尝试帮我们转化成正则
搜索数字
'a1a2a3'.search(1);
实际上是
'a1a2a3'.search(/1/);

String.prototype.match(reg)

  • match()方法将检索字符串,以找到一个或多个与regexp相匹配的文本
  • regexp 是否具有标志g对结果影响很大
非全局调用
  • 如果regexp没有标志g,那么march()方法就只能在字符串中执行一次匹配
  • 如果没有找到任何匹配的文本,将返回null
  • 否则他将返回一个数字,其中存放了与它找到的匹配文本有关的信息
    • 返回数组的第一个元素存放的是匹配文本,而其余元素存放的是与正则表达式的子表达式匹配的文本
    • 除了常规的数组元素之外,返回的数组还含有2个对象属性
      • index声明匹配文本的起始字符在字符串的位置
      • input 声明对 stringObject的引用
全局调用
  • 如果regexp具有标志g则march()方法将执行全局检索,找到字符串中的所有匹配子字符串
    • 没有找到任何匹配的子串,则返回null
    • 如果找到了一个或多个匹配子串,则返回一个数组
  • 数组元素中存放的是字符串中所有的匹配子串,而且也没有index属性或input属性

String.prototype.split(reg)

  • 我们经常使用split方法吧字符串分割为字符数组
'a,b,c,d'.split(',');
  • 在一些复杂的分割情况下我们可以使用正则表达式解决
'a1b2c3d'.split(/\d/);

String.prototype.replace()

  • String.prototype.replace(str,replaceStr)
  • String.prototype.replace(reg,replaceStr)
  • String.prototype.replace(reg,function)
function参数含义

function会在每次匹配替换的时候调用,有四个参数

  1. 匹配字符串
  2. 正则表达式分组内容,没有分组则没有该参数
  3. 匹配项在字符串中的index
  4. 原字符串

猜你喜欢

转载自blog.csdn.net/qq_27984879/article/details/86582334