Javascript字符串檢索的方法總結(jié)

字符串檢索相關(guān)的操作總結(jié)

前言擴(kuò)展: 正則

在javascirpt里面可以用兩種方法創(chuàng)建一個(gè)正則對象

1、使用字面量 /pattern/

var reg= /^[0-9]$/;    
var reg= /ab+c/i;

2、使用構(gòu)造函數(shù) new (pattern[,flags])

第二個(gè)參數(shù)為可選, 包含屬性 "g"、"i" 和 "m",分別用于指定全局匹配、區(qū)分大小寫的匹配和多行匹配

修飾符| 描述
----|------|----
i| 執(zhí)行對大小寫不敏感的匹配(ignore case)
g| 執(zhí)行全局匹配(查找所有匹配項(xiàng)而非在找到第一個(gè)匹配后停止)(global)
m| 執(zhí)行多行匹配。也就是,^ 和 $ 可以匹配字符串中每一行的開始和結(jié)束(行是由 \n 或 \r 分割的),而不只是整個(gè)輸入字符串的最開始和最末尾處。(multiline)

注:正則的快速學(xué)習(xí)教程推薦

var reg= new RegExp('^abc{1}[0-9]*$','i');   正則表達(dá)式運(yùn)行時(shí)編譯
var reg= new RegExp('^abc{1}[0-9]*$'); 
var reg= new RegExp(/ab+c/,'i');  直接使用正則表達(dá)式構(gòu)造對象
var reg= new RegExp(/ab+c/i)

注:ECMA6之前,如果第一個(gè)參數(shù)是正則表達(dá)式而不是字符串的時(shí)候,第二個(gè)參數(shù)必須省略,否則會跑出TypeError (“當(dāng)從其他正則表達(dá)式進(jìn)行構(gòu)造時(shí)不支持標(biāo)志”)異常
到了ECMA6,不再拋出錯(cuò)誤。那此時(shí)第二個(gè)參數(shù)有沒有用呢?我們來試一試

var reg= new RegExp(/^abc{1}[0-9]*$/,'i'); reg.test('Abc5');
//true 實(shí)際等同下一條
var reg= new RegExp(/^abc{1}[0-9]*$/i); reg.test('Abc5');
//true 
var reg= new RegExp(/^abc{1}[0-9]*$/); reg.test('Abc5');
//false

可以看到,當(dāng)?shù)谝粎?shù)是正則表達(dá)式的時(shí)候,第二個(gè)參數(shù)還是可以正確使用的
(chrome v49.0.2623)

方法| 描述
----|------|----
compile| 編譯正則表達(dá)式
exec| 檢索字符串中指定的值。返回找到的值,并確定其位置。
test| 檢索字符串中指定的值。返回 true 或 false。

注:正則的快速學(xué)習(xí)教程推薦http://deerchao.net/tutorials/regex/regex-1.htm


下面正式進(jìn)入主題

1、test

RegExpObject.test(string)

test() 方法是正則對象的一個(gè)方法,用于檢測一個(gè)字符串是否匹配某個(gè)模式,返回 true 或 false。

對,我們可以編寫相應(yīng)的正則方法,然后使用Reg對象的test方法來檢測是否存在相關(guān)字符串,而且還可以很自由地掌控檢測規(guī)則,例如目標(biāo)字符串在多少位后出現(xiàn),重復(fù)出現(xiàn)幾次等等
實(shí)際上與這個(gè)表達(dá)式是等價(jià)的 (r.exec(s)!=null)

var reg= new RegExp(/^abc{1}[0-9]*$/); reg.test('abc5');  //true         
var reg= new RegExp(/^abc{1}[0-9]*$/); reg.test('cccabc5'); // false  
var reg= new RegExp(/^abc{1}[0-9]*$/i); reg.test('Abc5');  //true 
var reg= new RegExp(/^abc{1}[0-9]*$/); reg.test('Abc5');  //false  
//在開頭abc出現(xiàn)一次之后跟著若干個(gè)數(shù)字

test方法會更新lastIndex屬性

var strs='Markdown markdown markdown'; 
var reg=new RegExp(/markdown/g);
reg.test(strs);//true
console.log(reg.lastIndex)//17
reg.test(strs);//true
console.log(reg.lastIndex)//26
reg.test(strs);//false
console.log(reg.lastIndex)//0

2、exec

RegExpObject.exec(string)

在循環(huán)中反復(fù)地調(diào)用 exec() 方法是唯一一種獲得全局模式的完整模式匹配信息的方法。

exec也是正則對象的一個(gè)方法,可檢索字符串中指定的值,返回一個(gè)數(shù)組,其中存放匹配的結(jié)果。它的使用比test()或者支持正則的StringObject的方法更復(fù)雜

  • 如果未找到匹配,則返回值為 null

  • 如果不包括g標(biāo)志,返回一個(gè)結(jié)果數(shù)組,此數(shù)組的第 0 個(gè)元素是與正則表達(dá)式相匹配的文本,第 1 個(gè)元素是與 RegExpObject 的第 1 個(gè)子表達(dá)式相匹配的文本(如果有的話),第 2 個(gè)元素是與 RegExpObject 的第 2 個(gè)子表達(dá)式相匹配的文本(如果有的話),即返回stringObject.match()相同的結(jié)果;

    除了數(shù)組元素和 length 屬性之外,exec() 方法還返回兩個(gè)屬性。index 表示匹配結(jié)果在原字符串中的索引。input 屬性則存放的是被檢索的字符串 string。

  • 如果正則表達(dá)式包括g標(biāo)志,返回一個(gè)數(shù)組,數(shù)組的內(nèi)容是所有包含匹配的字符串。不是位置!不是位置!;它會在RegExp的lastIndex置頂?shù)奈恢瞄_始檢索字符串,當(dāng)exec()找到了一個(gè)與表達(dá)式匹配的文本后,在匹配后,會吧lastIndex改為匹配文本的最后一個(gè)字符的最后一個(gè)位置。That mean 我們可以通過反復(fù)調(diào)用exec()來便利字符串中的所有匹配文本,當(dāng)exec()再找不到匹配的文本時(shí),將返回null,并把lastIndex置為0;
    注意:它不會一次返回所有匹配的項(xiàng),而是每次執(zhí)行都從lastIndex開始找一個(gè)匹配項(xiàng),就返回

var str="Jianshu markdown bu zhi chi table Markdown,markdown repeat";
var agi=new RegExp('markdown','gi');
//var agi=new RegExp(/markdown/gi);
console.log(agi.exec(str)) console.log(ag.lastIndex)
console.log(agi.exec(str)) console.log(ag.lastIndex)
console.log(agi.exec(str)) console.log(ag.lastIndex)

//["markdown", index: 8, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//16
//["Markdown", index: 34, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//42
//["markdown", index: 45, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//53
//null
//0
//global模式下每次返回一個(gè)匹配的值,改變lastIndex的值

var ai=new RegExp('markdown','i');
//var ai=new RegExp(/markdown/i);
console.log(ai.exec(str));console.log(ai.lastIndex)
console.log(ai.exec(str));console.log(ai.lastIndex)
console.log(ai.exec(str));
//["markdown", index: 8, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//0
//["markdown", index: 8, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//0
//["markdown", index: 8, input: "Jianshu markdown bu zhi chi table Markdown , markdown repeat"]
//沒有g(shù)lobal標(biāo)志,三次執(zhí)行結(jié)果一樣,不會改變lastIndex的值



3、search

stringObject.search(regexp)

用于檢索字符串中指定的子字符串,或檢索 與正則表達(dá)式相匹配的子字符串。返回第一個(gè)與regexp相匹配的子串的起始位置,如果要執(zhí)行忽略大小寫的檢索,追加標(biāo)志i

特性:對大小寫敏感,且不執(zhí)行全局匹配,忽略標(biāo)志g,也忽略lastIndex屬性,總是從字符串的開始進(jìn)行檢索
var a="Jianshu markdown bu zhi chi table Markdown";
a.search('jianshu');      //-1
a.search('Jianshu');      //0
a.search('markdown');      //8
a.search(/\bmarkdown\b/) ; //8

a.search(/JIanShu/i)    //0 使用search做忽略大小寫的匹配呢,就是在后面加i

4、match

stringObject.match(regexp)

當(dāng)字符串匹配到正則表達(dá)式的時(shí)候,match()會提取匹配項(xiàng)

  • 如果正則表達(dá)式包括g標(biāo)志,返回一個(gè)數(shù)組,數(shù)組的內(nèi)容是所有包含匹配的字符串。注意!不是位置!不是位置!;
  • 如果不包括g標(biāo)志,返回一個(gè)數(shù)組,內(nèi)容是第一個(gè)匹配的字符串,即返回與Reg.exec(str)相同的結(jié)果;
    而且返回的數(shù)組擁有額外的一個(gè)input屬性,該屬性包含原始字符串,另外還有一個(gè)index屬性,表示匹配結(jié)果在原字符串中的索引
  • 如果未找到匹配,則返回值為 null

參數(shù)是一個(gè)正則表達(dá)式對象,如果傳入一個(gè)非正則表達(dá)式對象,會隱式使用New RegExp(obj)將其轉(zhuǎn)換為正則表達(dá)式對象

var b='Markdown markdown markdown'; 
b.match(/markdown/ig) //["Markdown", "markdown", "markdown"]
b.match(/markdown/i)  //["Markdown"]
b.match('markdown') //["markdown"] 這里發(fā)生了一次隱式轉(zhuǎn)換
b.match('markdown/i') //null 因?yàn)槭侵苯影蒻arkdown/i整個(gè)字符串進(jìn)行RegExp構(gòu)建的

var c=b.match(/markdown/) 
console.log(c); //["markdown", index: 9, input: "Markdown markdown markdown"]
//嘗試設(shè)置lastIndex改變匹配起始處
var b='Markdown markdown markdown'; 
var temp=new RegExp(/markdown/);
temp.lastIndex=18;
var c=b.match(temp);
console.log(c)
//["markdown", index: 9, input: "Markdown markdown markdown"]
//似乎沒有用

在w3c的頁面找到了一個(gè)說明

重要事項(xiàng):不具有標(biāo)志 g 和不表示全局模式的 RegExp 對象不能使用 lastIndex 屬性。

好,那在全局模式再試一下

var b='Markdown markdown markdown'; 
var temp=new RegExp(/markdown/g);
temp.lastIndex=18;
var c=b.match(temp);
console.log(c)
//["markdown", "markdown"]
//依然沒有用

5、includes

includes() 方法用于 判斷一個(gè)字符串是否被包含在另一個(gè)字符串中,如果是返回 true,否則返回 false。該方法區(qū)分大小寫

兼容性:ECMA6,chrome 41+、firefox 40+,safari 9+;ie全系不支持

stringObject.includes(searchString [, position])

searchString 將要搜尋的子字符串。 position
可選。從當(dāng)前字符串的哪個(gè)索引位置開始搜尋子字符串;默認(rèn)為0。

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false
console.log(str.includes('To be', 1));    // false
console.log(str.includes('TO BE'));       // false
Polyfill:
if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }
    
    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}
總結(jié)一下
str.includes()跟RegExp.test()類似,返回一個(gè)布爾值
str.match()跟RegExp.exec()類似,返回一個(gè)數(shù)組或null
str.search()返回第一次出現(xiàn)的位置,與indexOf類似
會更新lastIndex屬性的有RegExp.test()以及RegExp.exec()

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,691評論 0 4
  • 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 790評論 0 0
  • '^'必須才開頭開始匹配'$'必須在末尾結(jié)束匹配'|' 表示‘或’/ab|cd/匹配ab或者cd'.'表示點(diǎn)字符(...
    zjh111閱讀 478評論 0 0
  • 假設(shè)用戶需要在HTML 表單中填寫姓名、地址、出生日期等。那么在將表單提交到服務(wù)器進(jìn)一步處理前,JavaScrip...
    胖先森閱讀 447評論 0 2
  • 這是年輕創(chuàng)始人的成長過程,那個(gè)時(shí)刻我才認(rèn)清到自己,才把光環(huán)剝離掉,重新認(rèn)識什么才是真正的創(chuàng)業(yè)。 姚欣先生創(chuàng)業(yè)...
    朱習(xí)培閱讀 516評論 0 0

友情鏈接更多精彩內(nèi)容