相似於對象、數組,正則表達式也有表達式寫法和構造函數寫法兩種正則表達式
var re = /a/ // 須要注意的是,這裏'//'之間必須得有內容,不然會當作註釋 var re = new RegExp('a')複製代碼
以上兩種寫法是等價的。數組
test方法用來判斷字符串中是否能匹配到正則設定的內容,若是能匹配則返回true,不然返回falsebash
語法:正則.test(字符串)函數
var str = 'ytuhayij68' var re = /a/ console.log(re.test(str)) // true複製代碼
search方法用來查找字符串中是否含有正則規定的內容,若是有則返回索引,不然返回-1ui
語法:字符串.search(正則)spa
var str = 'ytuhayij68' var re = /a/ console.log(str.search(re)) // 4複製代碼
match方法用來查找字符串中匹配正則規定的內容,若是能匹配則返回數組,數組中包含匹配到的項,不然返回nullcode
語法:字符串.match(正則)對象
var str = 'ytuhayij6a8'
var re = /a/
console.log(str.match(re)) // ["a", index: 4, input: "ytuhayij68", groups: undefined]複製代碼
這裏能夠看到,咱們最終的結果只返回了一個匹配的結果,正則默認第一次匹配成功則結束。若是咱們想要在字符串中查找全部符合條件的項,那麼須要在正則的後面加上g,表明全局匹配索引
var str = 'ytuhayiaj68' var re = /a/g console.log(str.match(re)) // ["a", "a"]複製代碼
replace方法用來查找字符串中匹配的內容,而後替換,返回新的字符串ip
語法:字符串.replace(正則,新字符串)或者字符串.replace(正則,回調函數)
var str = 'ytuhayiaj68' var re = /a/g console.log(str.replace(re, '*')) // ytuh*yi*j68複製代碼
當使用回調函數時,回調函數中能夠接受參數,第一個參數表明匹配到的值
var str = 'ytuhayiaj68' var re = /ha/g str.replace(re, function (str) { console.log(str) // ha })複製代碼
這裏有一個知識點須要注意,回調函數中從第二個參數開始接收的是正則的子項。
例如:var re = /(h)(a)(y)/g
這裏把(h)(a)(y)稱做母項,h爲第一個子項,a爲第二個子項,y爲第三個子項,依次類推。
通常第一個子項用$1表示,以後類推。
var str = 'ytuhayiaj68' var re = /(h)(a)(y)/g str.replace(re, function ($0, $1) { console.log($0) // hay console.log($1) // h })複製代碼
正則中經常使用到的轉義字符
\s:空格
\S:非空格
\d:數字
\D:非數字
\w:字符(字母、數字、下劃線)
\W:非字符
\b:單詞邊界
\B:非單詞邊界
\1:重複第一個子項
\2:重複第二個子項
. :表明任意字符(這個比較特殊)
咱們使用正則匹配時,可能須要如下場景,某個字符能夠匹配,也能夠不匹配,某個項須要匹配必定的次數,那麼這時就須要用到量詞了,正則中的經常使用量詞以下:
{4,7}:大於等於4次小於等於7次
{4,}:大於等於4次
{4}:等於4次
?:0次或1次 === {0,1}
+: 大於等於1次 === {1,}
*:大於等於0次 === {0,}
^:脫字符,匹配開頭,在多行匹配中匹配行開頭
$:美圓符號,匹配結尾,在多行匹配中匹配行結尾
\b:是單詞邊界,具體就是\w和\W之間的位置,也包括\w和^之間的位置,也包括\w和$之間的位置
\B:是\b的反面的意思,非單詞邊界。例如在字符串中全部位置中,扣掉\b,剩下的都是\B的。
(?=p):其中p是一個子模式,即p前面的位置
(?!p):就是(?=p)的反面意思
1.把字符串的開頭和結尾用'#'替換
var result = "hello".replace(/^|$/g,'#')console.log(result) // #hello#複製代碼
var result = 'I\nlove\nyou'.replace(/^|$/gm, '#')console.log(result) /** * #I# * #love# * #you# */複製代碼
多行匹配時,兩者是行的概念。
2.在字符l的前面添加'#'
var result = 'hello'.replace(/(?=l)/g,'#') console.log(result) // he#l#lo複製代碼
3.在除了l前面的位置添加'#'
var result = 'hello'.replace(/(?!l)/g,'#') console.log(result) // #h#ell#o#複製代碼
4.數字的千位分隔符表示法
var result = '2345567886756434'.replace(/(?!^)(?=(\d{3})+$)/g,',')console.log(result) // 2,345,567,886,756,434複製代碼
1.去掉某個字符串的收尾空格
var str = ' ytuhayiaj68 ' var re = /\b\s+|\s+\b/g var newStr = str.replace(re, '') console.log('(' + newStr + ')') // (ytuhayiaj68)複製代碼
這裏用到了\b,表示這個字符串的邊界。
或
var str = ' ytuhayiaj68 ' var re = /(^\s+)|(\s+$)/g var newStr = str.replace(re, '') console.log('(' + newStr + ')') // (ytuhayiaj68)複製代碼
注意:第二種寫法中有用到^和$這兩個字符,其中^寫在正則的前面表示字符串起始位置,$寫在正則的後面表示字符串的結束位置。
2.找到頁面中對應的class爲box1的項,將之背景變動爲紅色
<ul> <li class="box1"></li> <li></li> <li class="box1box2"></li> <li></li> <li class="box1 box2"></li> </ul> <script> var liList = document.getElementsByTagName('li') function changeBg(listNode, classItem) { var re = new RegExp('\\b' + classItem + '\\b') for (var i = 0; i < listNode.length; i++) { if (re.test(listNode[i].className)) { listNode[i].style.background = 'red' } } } changeBg(liList, 'box1') </script>複製代碼
這裏須要注意兩點,一個是若是正則中須要用變量的話,那麼必須用構造函數的方式來構造正則傳參。一個是添加\b時須要在前面加\,這樣才能將\b傳入正則中
3.關鍵字屏蔽,將字符串中的「導遊」和「遊客」都替換成「**」
var str = '責成涉事導遊員趙某某向遊客賠禮道歉,對涉事導遊員趙某某做出吊銷導遊證的行政處罰' var re = /導遊|遊客/g var newStr = str.replace(re, function ($0, $1) { var result = '' for (var i = 0; i < $0.length; i++) { result += '*' } return result }) console.log(newStr) // 責成涉事**員趙某某向**賠禮道歉,對涉事**員趙某某做出吊銷**證的行政處罰複製代碼
4.去掉字符串中包含的標籤,如<div><h3>等等
var str = '去掉<h3>字</h3>符串<div class="hello">中包</div>含的標籤' var re = /<[^>]+>/g console.log(str.replace(re, '')) // 去掉字符串中包含的標籤複製代碼
這裏在中括號內部使用了^,[^>]這個總體表明着非>的字符
5.將一個字符串轉化爲駝峯方式,如:"get-element-by-id"
var str = 'get-element-by-id'var re = /-\w/gvar newStr = str.replace(re, function ($0) { return $0.slice(1).toUpperCase()})console.log(newStr) // getElementById複製代碼
6.匹配xxyy模式
var str = 'xxyy'var re = /(\w)\1(\w)\2/console.log(re.test(str)) // true複製代碼