【问题标题】:What is the algorithm of the search() function?search() 函数的算法是什么?
【发布时间】:2012-11-11 01:18:27
【问题描述】:

有人知道javascript中search()函数使用的算法是什么吗?

var myRegExp = /Alex/;
var string1 = "Today John went to the store and talked with Alex.";
var matchPos1 = string1.search(myRegExp);

if(matchPos1 != -1)
    document.write("There was a match at position " + matchPos1); 
else
    document.write("There was no match in the first string");

Example copied tizaq.com

我需要使用这个函数在文本文档中搜索不同的字符串值。但是我需要记录下这个方法背后的算法是什么,复杂性是什么。否则我必须编写自己的方法来搜索我拥有的文本文件。

【问题讨论】:

  • 正则表达式引擎的详细实现...?你为什么要问,你真正想知道什么?
  • String#search 的规范可能是最好阅读的内容。
  • 我需要使用这个函数在一个文档中搜索不同的字符串。但我需要记录这种方法背后的算法是什么。否则我必须编写自己的方法来搜索我拥有的文本文件。
  • 如果不需要正则表达式,使用String.indexOf(),这是一个线性搜索。

标签: javascript algorithm search


【解决方案1】:

规范说它是作为正则表达式匹配实现的:

3) 如果 Type(regexp) 是 Object 并且 [[Class]] 内部的值 正则表达式的属性为“正则表达式”,则令rx为正则表达式;

4) 否则,设 rx 是一个新的 RegExp 对象,就好像由 表达式 new RegExp( regexp) 其中 RegExp 是标准内置 具有该名称的构造函数。

5) 从值字符串的开头搜索出现的 正则表达式模式 rx。让结果是一个数字,表示 模式匹配的字符串中的偏移量,如果存在则为 –1 没有匹配。 (...)

(Section 15.5.4.12 String.prototype.search (regexp)).

这意味着您的问题归结为正则表达式匹配算法。但这也不在规范中,它取决于实现:

[[Match]] 内部属性的值是 RegExp 对象的 Pattern 的实现依赖表示。

(Section 15.10.7 Properties of RegExp Instances).

因此,如果确实需要记录该算法的复杂性,我想您将不得不编写自己的方法。但请记住,通过这样做,您可能会想出一些效率较低的东西,并且可能依赖于复杂性未知的其他内置方法(甚至可能是RegExp 本身)。那么,你不能说服那些强大的力量,记录内置的、依赖于实现的 js 方法的复杂性不是你的工作吗?

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2012-02-27
    • 2018-02-07
    • 2012-10-02
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多