如何在不使用正则表达式的情况下在给定的“文本”中找到“(子字符串)”?

时间:2014-02-09 23:54:10

标签: javascript

最近我在接受采访时被问到,面试官问我上面这个问题。

我肯定感到困惑并通过使用for循环实现来回答他

  1. 我们会找到给定“文本”的长度(使用JavaScript)... str.length() ...
  2. 我们将采用“模式”的第一个元素,并在“文本”中找到它。
  3. 如果找到,我们会增加数组..因为字符串在JavaScript中存储为数组..
  4. 我们会以类似的方式找到“(子串)”。
  5. 知道这可能是错误的方式,但任何人都可以提出更好的方法吗?谢谢: - )

2 个答案:

答案 0 :(得分:1)

  

String.prototype.search (regexp)

     

使用参数regexp调用搜索方法时,将执行以下步骤:

     
      
  1. 调用CheckObjectCoercible将此值作为参数传递。

  2.   
  3. 让string成为调用ToString的结果,并将此值作为参数。

  4.   
  5. 如果Type(regexp)是Object并且regexp的[[Class]]内部属性的值是“RegExp”,那么让rx为regexp;

  6.   
  7. 否则,让rx成为一个新的RegExp对象,就像使用表达式new RegExp(regexp)一样,其中RegExp是具有该名称的标准内置构造函数。

  8.   
  9. 从头开始搜索值字符串,以发生正则表达式模式rx。设result为一个数字,表示模式匹配的字符串中的偏移量,如果没有匹配则为-1。执行搜索时,将忽略regexp的lastIndex和全局属性。 regexp的lastIndex属性保持不变。

  10.   
  11. 返回结果。

  12.   

或者,如果你想完全避免单词RegExp并搜索一个子字符串,那么

  

String.prototype.indexOf (searchString, position)

     

如果searchString显示为将此对象转换为String的结果的子字符串,则在一个或多个大于或等于position的位置,则返回最小的此类位置的索引;否则,返回-1。如果position未定义,则假定为0,以便搜索所有String。

     

indexOf方法接受两个参数searchString和position,并执行以下步骤:

     
      
  1. 调用CheckObjectCoercible将此值作为参数传递。

  2.   
  3. 设S是调用ToString的结果,并将此值作为参数。

  4.   
  5. 让searchStr为ToString(searchString)。

  6.   
  7. 设pos为ToInteger(位置)。 (如果未定义位置,则此步骤将生成值0)。

  8.   
  9. 设len为S中的字符数。

  10.   
  11. 让我们开始为min(max(pos,0),len)。

  12.   
  13. 让searchLen成为searchStr中的字符数。

  14.   
  15. 返回不小于start的最小可能整数k,使得k + searchLen不大于len,并且对于小于searchLen的所有非负整数j,S的位置k + j处的字符与searchStr位置j的字符;但如果没有这样的整数k,则返回值-1。

  16.   

答案 1 :(得分:0)

我认为答案取决于背景,而且背景似乎缺乏。

如果问题是关于算法的,那么我相信你最好的算法选择(即最快的算法)是Boyer–Moore string search

如果问题是PHP中的HowTo,则可能是string.indexOf。 <{1}}可能不是一个有效的答案,因为它需要一个正则表达式。

  
      
  1. S [i]指的是字符串S的索引i处的字符,从1开始计算。
  2.   
  3. S [i..j]是指从索引i开始到j结束的字符串S的子串。
  4.   
  5. 对于范围为[1,n]的某些i,S的前缀是子串S [1..i],其中n是S的长度。
  6.   
  7. S的后缀是范围[1,n]中某些i的子串S [i..n],其中n是S的长度。
  8.   
  9. 要搜索的字符串称为模式,并用符号P。
  10. 表示   
  11. 正在搜索的字符串称为文本,并以符号T。
  12. 引用   
  13. P的长度是n。
  14.   
  15. T的长度是m。
  16.   
  17. P与T的对齐是T中的索引k,使得P的最后一个字符与T的索引k对齐。
  18.   
  19. 如果P等于T [(k-n + 1).. k],则在对齐处发生P的匹配或出现。
  20.