正則表達(dá)式要么匹配字符,要么匹配位置。
一、字符串的位置
就是整個(gè)字符串前后和單個(gè)字符之間的位置,例如下圖:二、正則表達(dá)式如何匹配位置
1、es5中匹配位置的正則:
^, $, \b, \B, (?=p), (?!p)
^
(脫字節(jié)),匹配字符串開始的位置。
$
(美元符號(hào)),匹配字符串結(jié)尾的位置。
現(xiàn)在我么給"hello"前面和后面添加一個(gè)$符號(hào),例子如下:
var result = "hello".replace(/^|$/g, "$");
console.log(result)
// => $hello$
2、\b和\B
\b是單詞邊界,是\w和\W之間、\w和^之間、\w和$之間的位置。
比如一個(gè)文件名是"[JS] learn_01.md"中的\b,如下:
var str = "[JS] learn_01.md";
console.log(str.replace(/\b/g, "$"))
// => [$JS$] $learn_01$.$md$
我面可以分析一下上面的結(jié)果,\w正則表達(dá)式是[0-9a-zA-Z_]來表示,\W正好和\w相反是[^0-9a-zA-Z_],所以[
,]
,.
這三個(gè)字符與\w之間會(huì)添加#,字符串結(jié)尾是\w和$之間,所以也會(huì)添加上#。
我們把上面的例子中的\b替換成\B, 代碼如下:
var str = "[JS] learn_01.md";
console.log(str.replace(/\B/g, "$"))
VM92:2 $[J$S]$ l$e$a$r$n$_$0$1.m$d
3、 (?=p)和(?!p)
(?=p)中的p是一個(gè)子模式,即p前面的位置,比如(?=l),是l前面的位置。 例子如下:
var str = "hello";
console.log(str.replace(/(?=l)/g, "$"));
// => he$l$lo
(?!p)就是和(?=p)相反的意思, 例子如下:
var str = "hello";
console.log(str.replace(/(?!l)/g, "$"));
// => he$l$lo
4、案例分析
面試中遇到的一個(gè)題目,把"12345678",變成"12,345,678"。
(1)先讓他有一個(gè)逗號(hào),例子如下:
var str = "12345678"
var result = str.replace(/(?=\d{3}$)/g, ',')
console.log(result);
// => "12345,678"
(2) 弄出所有的逗號(hào), 例子如下:
var str = "12345678"
var result = str.replace(/(?=(\d{3})+$)/g, ',')
console.log(result)
// => "12,345,678"
(3)多驗(yàn)證幾下會(huì)出現(xiàn)問題
var str = "123456789"
var result = str.replace(/(?=(\d{3})+$)/g, ',')
console.log(result)
// => ",123,456,789"
我們并不需要最前面的那個(gè)逗號(hào),我們需要不讓匹配到最前面的位置,那就用(?!^)就可以解決,例子如下:
var str = "123456789"
var result = str.replace(/(?!^)(?=(\d{3})+$)/g, ',')
console.log(result)
// => "123,456,789"