type
status
date
slug
summary
tags
category
icon
password
使用正则匹配文本
问:如何匹配华氏度 摄氏度并对其进行不一样的处理?
答:
- 利用
()
进行分组捕获,js中replace
的第2个参数是函数,可以获得捕获的内容并进行处理,第一个()
就是$1
,第二个()
是$2
。
(?:)
捕获的顺序是按照括号写的顺序,所以即使是嵌套(())
也会按照顺序进行捕获,如果不想捕获某一个内容((?:))
可以在括号最前面写?:
代表“非捕获型括号”。
- 用
\s*
代表匹配任何的空白。
常用简写
\t | 指标符 tab键 |
\n | 换行符 |
\r | 回车符 |
\s | 任何空白字符 |
\S | 除了\s外的其他字符 |
\w | [0-9A-Za-z] |
\W | [^0-9A-Za-z] |
\d | [0-9] |
\D | [^0-9] |
使用正则修改文本
问:如何将数字保留后两位,如果第三位有值就保留三位
答:
$1
为()
捕获的内容。只返回匹配到的内容,就相当于把其余部分删除掉
使用正则插入文本-环视
环视结构不匹配任何字符,只匹配文本中特定的位置,与^$\b 这类元字符相似,只表示范围。
肯定顺序环视(?=)
问:如何把
Jeffs
修改为 Jeff's
?答:
- 顺序是正则匹配的顺序,正常代码是
从左到右
依次执行的。所以顺序环视,是看后面的内容。
- 环视不会进行捕获,也就不会有
$1
$2
这种变量。
- 环视匹配的只是位置,环视代码前面的位置,也就是插入
'
的位置。
肯定逆序环视(?<=)
问:如何把
Jeffs
修改为 Jeff's
?答:
- 逆序环视,就是按照正则执行的反过来
从右向左
,这个单词前面必须是\bJeff
后面必须是s\b
才会匹配到。
- 不进行捕获,只是匹配位置,所以可以插入
'
进去
- 第一个和第二个顺序变换,但是意义是一致的。并不会影响代码的执行
- 这样不捕获,可以提高正则的性能。但是易读性差了很多。
其他例子(插入逗号)
问:如何给一组数字插入逗号,如
123456789
变为123,456,789
答:
(?=(?:\d{3})+$)
只有这个表达式会把,123
前面也加上逗号,所以要用(?<=\d)
来限定左边必须要有数字。
(?=(?:\d{3})+$)
表达式就只有\d{3}
这个部分,每三个数字匹配。其他元字符都是用来装饰这个部分的。+
代表1到多次的3个数字组合都找出来。(?!\d)
右侧不是数字就结束。
- 后面放g是因为要全局匹配。
四种类型的环视
类型 | 正则表达式 | 匹配成功的条件 |
肯定逆序环视 | (?<=...) | 子表达式能够匹配左侧的文本 |
否定逆序环视 | (?<!...) | 子表达式不能匹配左侧文本 |
肯定顺序环视 | (?=...) | 子表达式能够匹配右侧文本 |
否则顺序环视 | (?!...) | 子表达式不能匹配右侧文本 |
问: 如何表示
\b
?答:
- 表示单词的起始或结束
(?<!\w)(?=\w)
左侧不是,右侧是
(?<=\w)(?!\w)/
左侧是,右侧不是
- 作者:yingwinwin
- 链接:https://yingwinwin.top/article/cd907841-b346-413b-83eb-1ac088ca4973
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章