指定匹配位置
上一篇我们讲到了分组与引用,本文就从指定匹配位置开始讲。
在正则表达式中,我可以利用某些字符,去指定匹配发生的位置。这些字符我们称之为正则表达式的锚。
字符 |
含义 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界的位置 |
(?=p) | 零宽正向先行断言,?=后面的字符都要与p匹配,但不能包括p的那些字符 |
(?!p) | 零宽负向先行断言,?!后面的字符不与p匹配 |
我们来逐个说一下这几个字符的用法:
- ^ 符号
^ 这个符号是将匹配位置定位到字符串的开头,直接来看一个例子
/*--------------------------第一种情况--------------------*/ let pattern = /^javascript/let str = "javascript is fun" str.match(pattern) //返回 ['javascript'] /*--------------------------第二种情况--------------------*/ let pattern = /^javascript/let str = "i love javascript" str.match(pattern) //返回 null
我们匹配的模式是,要以javascript开头的字符串。第一种情况,字符串以 javascript
开头,所以能匹配到;第二种情况,javascript
不是在开头的位置,而是在末尾的位置,不符合匹配模式,所以匹配失败返回null。
在前面我们有一个地方还用到了 ^ 这个符号,那就是 [^abc]
,所以一定要注意,当 ^ 放在方括号里,表示的是取反,也就是说不匹配方括号里的任何字符。
- $ 符号
$ 这个符号是将匹配位置定位到字符串的末尾,直接来看一个例子
/*--------------------------第一种情况--------------------*/ let pattern = /javascript$/let str = "javascript is fun" str.match(pattern) //返回 null /*--------------------------第二种情况--------------------*/ let pattern = /javascript$/let str = "i love javascript" str.match(pattern) //返回 ['javascript']
我们的匹配模式是,字符串要以javascript结尾。第一种情况,字符串结尾处字符是 fun ,不符合匹配模式,返回null;第二种情况,结尾处字符为javascript,符合匹配模式,所以匹配成功。
我们可以看一下如果 ^ 符号 和 $ 符号一起使用是什么情况:
let pattern = /^javascript$/let str = "javascript" str.match(pattern) //返回 ["javascript"]
当这两个符号一起使用时,匹配模式就变成了匹配整段字符串,并且字符串的内容就是 ^ 与 $ 之间的内容
- \b
这个符号的作用是匹配一个单词的边界,我们来看几个例子来理解一下
/*-------------------------第一种情况----------------------*/ let pattern = /\bjava/let str = "I love javascript" str.match(pattern) // 返回 ['java'] 匹配成功 /*-------------------------第二种情况----------------------*/ let pattern = /\bjava/let str = "javascript is fun" str.match(pattern) // 返回 ['java'] 匹配成功 /*-------------------------第三种情况----------------------*/ let pattern = /\bjava/let str = "1javascript is fun" str.match(pattern) // 返回 null 匹配失败 /*-------------------------第四种情况----------------------*/ let pattern = /java\b/let str = "I am learning java" str.match(pattern) // 返回 ['java'] 匹配成功 /*-------------------------第五种情况----------------------*/ let pattern = /java\b/let str = "I am learning javascript" str.match(pattern) // 返回 null 匹配失败 /*-------------------------第六种情况----------------------*/ let pattern = /\bjava\b/let str = "I think java is fun" str.match(pattern) // 返回 ['java'] 匹配成功
看了上面几个例子,你有没有得出什么规律?
其实 \b
的作用就是将匹配的点放到一个字符串前面(\b放前面)或后面(\b放后面)的 [^a-zA-Z0-9]
处,也可以理解为 \b 可以替换那些特殊字符,但 \b 不会作为匹配的内容。
- \B
\B 则与 \b 相反了, \b 可以替换那些特殊字符,那么\B就是用来替换那些非特殊字符,也就是 [a-zA-Z0-9]
内的字符。
也来举几个简单的例子吧
/*-------------------------第一种情况----------------------*/ let pattern = /java\B/let str = "I love javascript" str.match(pattern) // 返回 ['java'] 匹配成功 /*-------------------------第二种情况----------------------*/ let pattern = /java\B/let str = "I love java" str.match(pattern) // 返回 null 匹配失败 /*-------------------------第三种情况----------------------*/ let pattern = /\Bjava\B/let str = "I love 1javascript" str.match(pattern) // 返回 ['java'] 匹配成功 /*-------------------------第四种情况----------------------*/ let pattern = /\Bjava\B/let str = "I love javascript" str.match(pattern) // 返回 null 匹配失败
- (?=p)
(?=p)表示接下来的字符要与p匹配,但p不会作为内容返回
先来看一个例子
let pattern = /java(script)?(?=\:)/let str = "java: my favorite language" str.match(pattern) //返回 ["java", undefined] 匹配成功
该例子的匹配模式:匹配一段字符串为java 然后 script 可以有一个也可以没有,后面必须跟一个 :
,才能匹配成功,返回匹配内容,但是匹配内容中不包含 :
再来看一个类似的例子
let pattern = /java(script)?(?=\:)/let str = "javascript is my favorite language" str.match(pattern) //返回 null 匹配失败
该例子匹配失败是因为字符串中的javascript后面没有 :
,没有满足 (?=\:)
的匹配要求
- (?!p)
(?!p)与(?=p)相反,它表示接下来的字符不与p匹配
我们也来看一个例子
let pattern = /java(?!script)/let str = "javascript is my favorite language" str.match(pattern) //返回 null 匹配失败
该例子的匹配模式是:匹配一段字符,只要java后面紧跟着的字符不是script即为匹配成功,同时java后面跟的内容也不会作为内容返回。但这个例子中的 str 里, java后面紧跟着的就是script,所以匹配失败。那么成功的例子就是这样的
let pattern = /java(?!script)/let str = "javascr1111 is my favorite language" str.match(pattern) //返回 ["java"] 匹配成功
在该例子中, java 后面跟着的就不是script了,所以匹配成功了。java后面的字符不作为内容返回,所以最后的匹配结果就是 java
结束语
第三篇对于 JavaScript正则表达式的讲解就先到这里,明天后天会继续更新第四篇,并且我会在之后的文章上放上前几篇的文章链接,方便大家观看,希望大家持续关注,点个关注,不迷路