信息检索的四种方法
的有关信息介绍如下:在前端开发过程中,我们经常会遇到关于检索关键词的问题。遇到这类问题,我们通常会用下面的四个方法来解决检索关键词的问题:
1.检索一个固定的关键词:
1.1String.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.2String.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()方法对大小写敏感 :
在本例中,我们将执行一次忽略大小写的检索:
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()。
实例
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 casevar re = /quick\s(brown).+?(jumps)/ig;var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
下面的表格展示这个脚本的返回值:
对象属性/索引描述例子
result匹配的全部字符串Quick Brown Fox Jumps
, ...[n]括号中的分组捕获 = Brown = Jumps
index匹配到的字符位于原始字符串的基于0的索引值4
input原始字符串The Quick Brown Fox Jumps Over The Lazy Dog
relastIndex下一次匹配开始的位置25
ignoreCase是否使用了'i'标记使正则匹配忽略大小写true
global是否使用了'g'标记来进行全局的匹配.true
multiline
是否使用了'm'标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。)
false
source正则模式的字符串quick\s(brown).+?(jumps)
实例