重温前端之正则表达式

正则表达式常用方法

str.match(regexp)

  • 如果不带有 g 标记,则以数组形式返回第一个匹配项,包含详细信息
  • 如果带有 g,则将所有匹配项作为字符串返回,不包含详细信息
  • 若没有匹配项,返回 null

str.matchAll(regexp)

  • 它返回包含匹配项的可迭代对象,而不是数组。我们可以用 Array.from 从中得到一个常规数组。
  • 每个匹配项均以包含分组的数组形式返回(返回格式与不带 g 标记的 str.match 相同)。
  • 如果没有结果,则返回的不是 null,而是一个空的可迭代对象。

str.replace(str|regexp, str|func)

  • 当 replace 的第一个参数是字符串时,它仅替换第一个匹配项
  • 第二个参数是一个替代字符串。我们可以在其中使用特殊字符:
符号替换字符串中的操作
$&插入整个匹配项
$`在匹配项之前插入字符串的一部分
$’在匹配项之后插入字符串的一部分
$n如果 n 是一个 1 到 2 位的数字,则插入第 n 个分组的内容,详见 捕获组
$插入带有给定 name 的括号内的内容,详见 捕获组
$$插入字符 $
"John Smith".replace(/(john) (smith)/i, "$2, $1"); // Smith, John
  • 第二个参数可以是一个函数,每次匹配都会调用这个函数,并且返回的值将作为替换字符串插入。
"html and css".replace(/html|css/gi, (str) => str.toUpperCase()); // HTML and CSS

regexp.test(str)

  • 查找匹配项,然后返回 true/false 表示是否存在,如/love/i.test("I love JavaScript")为 true

修饰符

大小写 i

搜索时不区分大小写

全局 g

查找所有匹配项,默认只有一个

多行 m

  • 多行模式
  • 可以对有换行符的字符串进行全局匹配

u

开启完整的 unicode 支持

y

粘滞模式

字符类

数字字符\d

  • 任意一个数字(digit)
  • \D 取反

空格字符\s

  • 空格(space),包括制表符\t,换行符\n 等
  • \S 取反

字母字符\w

  • 字母(word)
  • \W 取反

常规字符 a-z

常规字符可以直接接在正则表达式里

通配符.

  • 匹配任何字符(一个)
  • 和换行符\n 不能匹配,使用修饰符 s 时可支持,如"A\nB".match(/A.B/s)

属性缩写字符\p

  • 字母(Letter) L:
小写(lowercase) Ll
修饰(modifier) Lm,
首字母大写(titlecase) Lt,
大写(uppercase) Lu,
其它(other) Lo。
  • 数字(Number) N:
  十进制数字(decimal digit) Nd,
  字母数字(letter number) Nl,
  其它(other) No。
  • 标点符号(Punctuation) P:
  链接符(connector) Pc,
  横杠(dash) Pd,
  起始引用号(initial quote) Pi,
  结束引用号(final quote) Pf,
  开(open) Ps,
  闭(close) Pe,
  其它(other) Po。
  • 符号(Symbol) S:
  货币(currency) Sc,
  修饰(modifier) Sk,
  数学(math) Sm,
  其它(other) So。
  • 分隔符(Separator) Z:
  行(line) Zl,
  段落(paragraph) Zp,
  空格(space) Zs。

小写的字母可以写成 \p{Ll},标点符号写作 \p{P} 等等,注意 ie 和火狐可能不支持

其他字符及链接

词边界\b

alert("hello,java!").match(/\bjava\b/); //java
alert("hello,javascript!").match(/\bjava\b/); //null

锚点字符

^

字符串开始

$

字符串结束


转义字符

  • 要在字面(意义)上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我们需要在它们前面加上反斜杠 \(“转义它们”)。
  • 如果我们在 /…/ 内部(但不在 new RegExp 内部),还需要转义 /。
  • 传递一个字符串(参数)给 new RegExp 时,我们需要双倍反斜杠 \,因为字符串引号会消费其中的一个。

集合与范围

集合

比如说,[eao] 意味着查找在 3 个字符 ‘a’、‘e’ 或者 `‘o’ 中的任意一个。

alert("Mop top".match(/[tm]op/gi)); // "Mop", "top"

范围

  • 比如说,[a-z] 会匹配从 a 到 z 范围内的字母,[0-5] 表示从 0 到 5 的数字。
  • 支持联合范围[0-9a-z],或是联合字符类范围[\d.]
  • 排除范围,使用,[0-9]匹配任何除了数字之外的字符
  • 在方括号范围内一般不需要进行转义

量词

数量{n}

  • 确切位数,如\d{5}表示 5 个数字
  • 范围位数,如\d{3,5}表示 3-5 个数字
  • 忽略上限,如\d{3,}表示大于 3 个数字

数量缩写

  • +代表一个或多个,相当于{1,}
  • ?代表一个或 0 个,相当于{0,1}
  • *代表 0 个或多个,相当于{0,}

贪婪量词

  • 默认启动
  • 匹配至最大限度 ,如"123456".match(/\d{1,}/)将匹配出["123456"]

懒惰量词

  • 使用带问号?的两次启用,?? | *? | +? | {m,n}?
  • 匹配至最小限度,如"123456".match(/\d{1,}?/g)将匹配出["1", "2", "3", "4", "5", "6", "7"]

捕获

捕获组

  • 使用()将内容包裹起来,令其后量词整组生效,被称作捕获组

捕获组内容获取

  • 可以使用\数字这种写法来实现分组捕获,如/(\d)([1,2])\1\2/中,\1代表第一个捕获组匹配的东西,\2代表第二个捕获组匹配的东西,
  • \数字代表的是确切值而不是表达式,如"21312".match(/([1,2])\d*?\1/),将匹配"21312"而非"2131"
  • 问号的特殊用法,在组内的最前面使用?:时,捕获组将被排除
  • 问号的特殊用法,在组内的最前面使用?<name>时,捕获组将被重命名,可使用\k<name>捕获,但不影响其原有\数字

选择

使用|将选项隔开

断言

这里的括号不被视为捕获组

前瞻断言

  • 语法x(?=y)
  • 后面紧跟的必须是 y,例如"1 turkey costs 30$".match(/\d+(?=$)/),将匹配 30

前瞻否定断言

  • 语法x(?!y)
  • 后面紧跟的必须不是 y

后瞻断言

  • 语法(?<=y)x
  • 前面紧跟的必须是 y

后瞻否定断言

  • 语法(?<!y)x
  • 前面紧跟的必须不是 y

特殊用法整理

^

  • 正常为起始符
  • 在方括号的起始位置使用代表范围取反

?

  • 正常为懒惰量词
  • 在捕获组的起始位置配合:使用,?:代表忽略该组
  • 在断言中?=为前瞻断言,?!为前瞻否定断言
  • 在断言中?<=为后瞻断言,?<!为后瞻否定断言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值