在前端開發過程中,我們經常會遇到關於檢索關鍵詞的問題。遇到這類問題,我們通常會用下面的四個方法來解決檢索關鍵詞的問題:
1.檢索一個固定的關鍵詞:
1.1 String.prototype.indexOf()-->indexOf()
方法返回指定值在字符串對象中首次出現的位置。從 fromIndex
位置開始查找,如果不存在,則返回 -1。
語法:
str.indexOf(searchValue[, fromIndex])
參數:
searchValue
一個字符串表示被查找的值。
fromIndex 可選
可選表示調用該方法的字符串中開始查找的位置。可以是任意整數。默認值為 0。如果 fromIndex < 0
則查找整個字符串(如同傳進了 0)。如果 fromIndex >= str.length
,則該方法返回 -1,除非被查找的字符串是一個空字符串,此時返回 str.length。
描述:
字符串中的字符被從左向右索引。首字符的索引(index)為 0,字符串 stringName
的最后一個字符的索引是 stringName.length - 1
。
"Blue Whale".indexOf("Blue"); // returns 0 "Blue Whale".indexOf("Blute"); // returns -1 "Blue Whale".indexOf("Whale", 0); // returns 5 "Blue Whale".indexOf("Whale", 5); // returns 5 "Blue Whale".indexOf("", 9); // returns 9 "Blue Whale".indexOf("", 10); // returns 10 "Blue Whale".indexOf("", 11); // returns 10
區分大小寫
indexOf
方法區分大小寫。例如,下面的表達式返回 -1:
"Blue Whale".indexOf("blue") // returns -1
檢測是否存在某字符串
當檢測某個字符串是否存在於另一個字符串中時,可使用下面的方法:
"Blue Whale".indexOf("Blue") !== -1; // true "Blue Whale".indexOf("Bloe") !== -1; // false
1.2 String.prototype.indexOf()-->lastIndexOf()方法返回調用字符串中的索引對象指定的最后出現的位置,從fromIndex向后搜索。如果沒有找到該值返回-1。
語法:
str.lastIndexOf(searchValue[, fromIndex])
參數:
searchValue
一個字符串表示被查找的值。
fromIndex 可選
可選表示調用該方法的字符串中開始查找的位置。可以是任意整數。默認值為 0。如果 fromIndex < 0
則查找整個字符串(如同傳進了 0)。如果 fromIndex >= str.length
,則該方法返回 -1,除非被查找的字符串是一個空字符串,此時返回 str.length。
描述:
字符串中的字符被從左向右索引。首字符的索引(index)為 0,字符串 stringName
的最后一個字符的索引是 stringName.length - 1
。
'canal'.lastIndexOf('a'); // returns 3 'canal'.lastIndexOf('a', 2); // returns 1 'canal'.lastIndexOf('a', 0); // returns -1 'canal'.lastIndexOf('x'); // returns -1 'canal'.lastIndexOf('c', -5); // returns 0 'canal'.lastIndexOf('c', 0); // returns 0 'canal'.lastIndexOf(''); // returns 5 'canal'.lastIndexOf('', 2); // returns 2
區分大小寫
lastindexOf
方法區分大小寫。例如,下面的表達式返回 -1:
'Blue Whale, Killer Whale'.lastIndexOf('blue'); // returns -1
2.檢索有沒有相應關鍵字:
String.prototype.search()-->String.prototype.search()方法執行一個搜索匹配正則表達式字符串對象。
語法:
str.search(regexp)
參數:
regexp
該參數可以是需要在 stringObject 中檢索的子串,也可以是需要檢索的 RegExp 對象。
注釋:要執行忽略大小寫的檢索,請追加標志 i。
說明
search() 方法不執行全局匹配,它將忽略標志 g。它同時忽略 regexp 的 lastIndex 屬性,並且總是從字符串的開始進行檢索,這意味着它總是返回 stringObject 的第一個匹配的位置。
實例
function testinput(re, str) { var midstring; if (str.search(re) != -1) { midstring = ' contains '; } else { midstring = ' does not contain '; } console.log(str + midstring + re); }
search()方法對大小寫敏感 :
<script type="text/javascript"> var str="Visit W3School!" document.write(str.search(/w3school/))//輸出-1 </script>
在本例中,我們將執行一次忽略大小寫的檢索:
<script type="text/javascript"> var str="Visit W3School!" document.write(str.search(/w3school/i))//輸出為6 </script>
3.檢索所有關鍵詞的內容:
String.prototype.match()-->match() 方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
語法:
str.match(regexp)
參數:
searchvalue | 必需。規定要檢索的字符串值。 |
regexp | 必需。規定要匹配的模式的 RegExp 對象。如果該參數不是 RegExp 對象,則需要首先把它傳遞給 RegExp 構造函數,將其轉換為 RegExp 對象。 |
返回值
存放匹配結果的數組。該數組的內容依賴於 regexp 是否具有全局標志 g。
說明
match() 方法將檢索字符串 stringObject,以找到一個或多個與 regexp 匹配的文本。這個方法的行為在很大程度上有賴於 regexp 是否具有標志 g。
如果 regexp 沒有標志 g,那么 match() 方法就只能在 stringObject 中執行一次匹配。如果沒有找到任何匹配的文本, match() 將返回 null。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。該數組的第 0 個元素存放的是匹配文本,而其余的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規的數組元素之外,返回的數組還含有兩個對象屬性。index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對 stringObject 的引用。
如果 regexp 具有標志 g,則 match() 方法將執行全局檢索,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串,則返回 null。如果找到了一個或多個匹配子串,則返回一個數組。不過全局匹配返回的數組的內容與前者大不相同,它的數組元素中存放的是 stringObject 中所有的匹配子串,而且也沒有 index 屬性或 input 屬性。
注意:在全局檢索模式下,match() 即不提供與子表達式匹配的文本的信息,也不聲明每個匹配子串的位置。如果您需要這些全局檢索的信息,可以使用 RegExp.exec()。
實例
<script type="text/javascript"> var str="1 plus 2 equal 3" document.write(str.match(/\d+/g))//輸出1,2,3 </script>
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; var regexp = /[A-E]/gi; var matches_array = str.match(regexp); console.log(matches_array); // ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
4.既可以找到關鍵字的位置,又可以返回關鍵字的位置:
RegExp.prototype.exec()-->exec() 方法
為指定的一段字符串執行搜索匹配操作。它的返回值是一個數組或者 null
。 如果你僅僅是為了知道是否匹配,可以使用 RegExp.test()
方法,或者 String.search()
方法。
語法
regexObj.exec(str)
參數
str
要用正則表達式匹配的字符串。
返回值
如果成功匹配,exec
方法返回一個數組,並且更新正則表達式對象的屬性。返回的數組包括匹配的字符串作為第一個元素,緊接着一個元素對應一個成功匹配被捕獲的字符串的捕獲括號(capturing parenthesis)。(one item for each capturing parenthesis that matched containing the text that was captured.)
如果匹配失敗,exec
方法將返回 null
。
描述
// Match "quick brown" followed by "jumps", ignoring characters in between // Remember "brown" and "jumps" // Ignore case var re = /quick\s(brown).+?(jumps)/ig; var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
下面的表格展示這個腳本的返回值:
對象 | 屬性/索引 | 描述 | 例子 |
result |
[0] |
匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n] |
括號中的分組捕獲 | [1] = Brown [2] = Jumps |
|
index |
匹配到的字符位於原始字符串的基於0的索引值 | 4 |
|
input |
原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re |
lastIndex |
下一次匹配開始的位置 | 25 |
ignoreCase |
是否使用了'i'標記使正則匹配忽略大小寫 | true |
|
global |
是否使用了'g'標記來進行全局的匹配. | true |
|
multiline |
是否使用了' |
false |
|
source |
正則模式的字符串 | quick\s(brown).+?(jumps) |
實例
<script type="text/javascript"> var str = "Visit W3School"; var patt = new RegExp("W3School","g"); var result; while ((result = patt.exec(str)) != null) { document.write(result);//輸出W3School document.write("<br />"); document.write(patt.lastIndex);//輸出14 } </script>
注意:不要把正則表達式字面量(或者正則表達式構造器)放在 while
條件表達式里。由於每次迭代時 lastIndex
的屬性都被重置,如果匹配,將會造成一個死循環。