JavaScript 正則表達式與字符串查找方法
如(rú)何取得一(yī)個給定的(de)字符串substr在另一(yī)個字符串str中出現的(de)次數?
字符串匹配,第一(yī)想到的(de)就是正則表達式,但我們最常使用的(de)字面量來創建的(de)正則表達式方式卻無法傳入變量,
這時應該使用另一(yī)種創建正則表達式的(de)方式:構造函數,如(rú)下
var reg = new RegExp(substr, "g");
可(kě)以傳入變量了,再介紹個字符串基本包裝類型的(de)方法:match()其中第一(yī)個參數表示要匹配的(de)字符串模式,因此可(kě)以傳入變量,不需要加/ /,第二個參數是可(kě)選的(de)标志字符串。
語法為(wèi)str.match(regExp),參數為(wèi)一(yī)個正則表達式,若傳的(de)不是正則則會隐式轉換,返回值為(wèi)一(yī)個包含匹配結果的(de)數組,如(rú)果沒有匹配項,則返回null。
另外,字符串的(de)match方法與正則的(de)exec()類似,返回匹配的(de)詳細信息;字符串的(de)search方法與正則的(de)test()類似,隻是用來查看是否匹配。
回到最初的(de)問題,完整的(de)程序如(rú)下:
var str1 = "abctestctesqk1test23";
var str2 = "test";
function countSubstr(str, substr) {
var reg = new RegExp(substr, "g");
return str.match(reg) ? str.match(reg).length : 0;//若match返回不為(wèi)null,則結果為(wèi)true,輸出match返回的(de)數組(["test","test"])的(de)長(cháng)度
}
console.log(countSubstr(str1, str2));//輸出2
另外,對于變量的(de)問題,不使用構造函數也可(kě)以解決,即使用eval():
var reg = "/" + substr + "/g";
reg = eval(reg);//不推薦!
但還是有個問題,如(rú)果子(zǐ)字符串中含有正則表達式中所謂的(de)元字符(即+*?^等),則無法正常匹配。但都知道(dào)不推薦使用eval()方法,所以還是推薦使用構造函數方法。
因為(wèi)此時正則表達式是在字符串裏的(de),\是字符串中的(de)轉義符,也是正則表達式中的(de)轉義符。那麽隻加一(yī)個\的(de)話,隻能說明在字符串中轉義,而js需要進一(yī)步把普通字符串中的(de)\變成正則表達式中的(de)\,像是更深一(yī)則轉化的(de)意思,稱為(wèi)雙重轉義,這樣\\以後的(de)意思是正則表達式中的(de)轉義符(\)。
所以對于那些元字符如(rú)果不進行雙重轉義,則無法真正查找要找的(de)那個字符。這個問題尚未解決,不過一(yī)般字符串查找也很少有這些特殊字符吧(ba),可(kě)以先一(yī)用。
編輯:--ns868