Javascript字符串檢索的方法總結

字符串檢索相關的操作總結

前言擴展: 正則

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

1政模、使用字面量 /pattern/

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

2较锡、使用構造函數(shù) new (pattern[,flags])

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

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

注:正則的快速學習教程推薦

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

注:ECMA6之前,如果第一個參數(shù)是正則表達式而不是字符串的時候隧饼,第二個參數(shù)必須省略沈堡,否則會跑出TypeError (“當從其他正則表達式進行構造時不支持標志”)異常
到了ECMA6,不再拋出錯誤燕雁。那此時第二個參數(shù)有沒有用呢诞丽?我們來試一試

var reg= new RegExp(/^abc{1}[0-9]*$/,'i'); reg.test('Abc5');
//true 實際等同下一條
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

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

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

注:正則的快速學習教程推薦http://deerchao.net/tutorials/regex/regex-1.htm


下面正式進入主題

1金踪、test

RegExpObject.test(string)

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

對法希,我們可以編寫相應的正則方法,然后使用Reg對象的test方法來檢測是否存在相關字符串靶瘸,而且還可以很自由地掌控檢測規(guī)則苫亦,例如目標字符串在多少位后出現(xiàn),重復出現(xiàn)幾次等等
實際上與這個表達式是等價的 (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)一次之后跟著若干個數(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)中反復地調用 exec() 方法是唯一一種獲得全局模式的完整模式匹配信息的方法屋剑。

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

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

  • 如果不包括g標志肄鸽,返回一個結果數(shù)組卫病,此數(shù)組的第 0 個元素是與正則表達式相匹配的文本油啤,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(如果有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(如果有的話)蟀苛,即返回stringObject.match()相同的結果益咬;

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

  • 如果正則表達式包括g標志,返回一個數(shù)組冗锁,數(shù)組的內容是所有包含匹配的字符串齐唆。不是位置!不是位置6澈印箍邮;它會在RegExp的lastIndex置頂?shù)奈恢瞄_始檢索字符串,當exec()找到了一個與表達式匹配的文本后叨叙,在匹配后锭弊,會吧lastIndex改為匹配文本的最后一個字符的最后一個位置。That mean 我們可以通過反復調用exec()來便利字符串中的所有匹配文本擂错,當exec()再找不到匹配的文本時味滞,將返回null,并把lastIndex置為0钮呀;
    注意:它不會一次返回所有匹配的項剑鞍,而是每次執(zhí)行都從lastIndex開始找一個匹配項,就返回

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模式下每次返回一個匹配的值,改變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"]
//沒有global標志攒暇,三次執(zhí)行結果一樣,不會改變lastIndex的值



3子房、search

stringObject.search(regexp)

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

特性:對大小寫敏感田度,且不執(zhí)行全局匹配,忽略標志g解愤,也忽略lastIndex屬性镇饺,總是從字符串的開始進行檢索
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)

當字符串匹配到正則表達式的時候奸笤,match()會提取匹配項

  • 如果正則表達式包括g標志,返回一個數(shù)組哼鬓,數(shù)組的內容是所有包含匹配的字符串监右。注意!不是位置异希!不是位置=『小;
  • 如果不包括g標志,返回一個數(shù)組扣癣,內容是第一個匹配的字符串惰帽,即返回與Reg.exec(str)相同的結果;
    而且返回的數(shù)組擁有額外的一個input屬性父虑,該屬性包含原始字符串该酗,另外還有一個index屬性,表示匹配結果在原字符串中的索引
  • 如果未找到匹配士嚎,則返回值為 null

參數(shù)是一個正則表達式對象垂涯,如果傳入一個非正則表達式對象,會隱式使用New RegExp(obj)將其轉換為正則表達式對象

var b='Markdown markdown markdown'; 
b.match(/markdown/ig) //["Markdown", "markdown", "markdown"]
b.match(/markdown/i)  //["Markdown"]
b.match('markdown') //["markdown"] 這里發(fā)生了一次隱式轉換
b.match('markdown/i') //null 因為是直接吧markdown/i整個字符串進行RegExp構建的

var c=b.match(/markdown/) 
console.log(c); //["markdown", index: 9, input: "Markdown markdown markdown"]
//嘗試設置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 和不表示全局模式的 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() 方法用于 判斷一個字符串是否被包含在另一個字符串中膳殷,如果是返回 true操骡,否則返回 false。該方法區(qū)分大小寫

兼容性:ECMA6赚窃,chrome 41+册招、firefox 40+,safari 9+勒极;ie全系不支持

stringObject.includes(searchString [, position])

searchString 將要搜尋的子字符串是掰。 position
可選。從當前字符串的哪個索引位置開始搜尋子字符串辱匿;默認為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;
    }
  };
}
總結一下
str.includes()跟RegExp.test()類似,返回一個布爾值
str.match()跟RegExp.exec()類似,返回一個數(shù)組或null
str.search()返回第一次出現(xiàn)的位置匾七,與indexOf類似
會更新lastIndex屬性的有RegExp.test()以及RegExp.exec()

參考資料:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末絮短,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昨忆,更是在濱河造成了極大的恐慌丁频,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑贴,死亡現(xiàn)場離奇詭異席里,居然都是意外死亡,警方通過查閱死者的電腦和手機拢驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門奖磁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人独旷,你說我怎么就攤上這事署穗×攘眩” “怎么了嵌洼?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵案疲,是天一觀的道長。 經(jīng)常有香客問我麻养,道長褐啡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任鳖昌,我火速辦了婚禮备畦,結果婚禮上,老公的妹妹穿的比我還像新娘许昨。我一直安慰自己懂盐,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布糕档。 她就那樣靜靜地躺著莉恼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪速那。 梳的紋絲不亂的頭發(fā)上俐银,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音端仰,去河邊找鬼捶惜。 笑死,一個胖子當著我的面吹牛荔烧,可吹牛的內容都是我干的吱七。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鹤竭,長吁一口氣:“原來是場噩夢啊……” “哼陪捷!你這毒婦竟也來了?” 一聲冷哼從身側響起诺擅,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤市袖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烁涌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苍碟,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年撮执,在試婚紗的時候發(fā)現(xiàn)自己被綠了微峰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抒钱,死狀恐怖蜓肆,靈堂內的尸體忽然破棺而出颜凯,到底是詐尸還是另有隱情,我是刑警寧澤仗扬,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布症概,位于F島的核電站,受9級特大地震影響早芭,放射性物質發(fā)生泄漏彼城。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一退个、第九天 我趴在偏房一處隱蔽的房頂上張望募壕。 院中可真熱鬧,春花似錦语盈、人聲如沸舱馅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽代嗤。三九已至,卻和暖如春照棋,著一層夾襖步出監(jiān)牢的瞬間资溃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工烈炭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溶锭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓符隙,卻偏偏與公主長得像趴捅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霹疫,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

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