环视与位置是正则表达式中的两个比较复杂难懂的概念。但是掌握后,对于正则的使用也会更得心应手,工作中的正则需求也就都能搞定了。
位置
正则表达式中只有匹配两种东西,一种是内容,另一种就是位置。
匹配内容:
/\w+/.exec('hello') // "hello"
\w
匹配到的是单词字符,所以\w
匹配的是内容。
在知道什么是内容后,那么什么是位置呢?
我们现在低头看看你的键盘的第一排字母按键q、w、e、r,可以看到q与w并不是完全挨在一起的,中间会有一条不算太宽大的缝。这条缝就可以理解成位置。一个 qwer
的字符串,其实就是从 tab
键到t
键中间的所有空间。
缝隙
+q
+缝隙
+w
+缝隙
+e
+缝隙
+r
+缝隙
一些其他匹配位置的常用匹配符
-
^
匹配开始的位置 -
$
匹配结束的位置 -
\b
匹配单词边界 -
\B
匹配非单词边界 -
(?=p)
、(?!p)
、(?<=p)
、?<!p
环视
环视
环视包括以下四种(后两种ES6支持)
- 正前瞻(positive lookahead)
- 负前瞻(negative lookahead)
- 正后顾(positive lookbehind)
- 负后顾(negative lookbehind)
一些官方的文档或博客上面会使用一些晦涩难懂(正向先行断言,负向先行断言等)的词来翻译以上四种环视。
所有的环视匹配的都是位置。
正前瞻
正前瞻语法为 (?=p)
,匹配p
前面的位置。
const str = 'qwer'
str.replace(/(?=w)/g, 'a') // "qawer"
把 w 前面的位置替换成 a。
负前瞻
负前瞻语法为(?!p)
,匹配结果是正前瞻的取反,匹配除了p
,所有其他字符前面的位置。
const str = 'qwer'
str.replace(/(?!w)/g, 'a') // "aqwaqar"
把除了w的字符前面的位置都替换成a
正后顾
前瞻是往前看,后顾自然就是往后看了。
正后顾语法(?<=p)
。匹配p
后面的位置。
const str = 'qwer'
str.replace(/(?<=w)/g, 'a') // "qwaer"
把w
后面的位置替换成a
。
负后顾
负后顾语法(?<!p)。匹配除了
p` 所有其它字符后面的位置。
const str = 'qwer'
str.replace(/(?<!w)/g, 'a') // "qaweara"
除了w
的其他字符后面的位置替换成a
以上就是位置与环视的核心内容了,其实把位置理解了,环视理解起来也就很简单了呢。
网友评论