【问题标题】:search() string for multiple occurrences多次出现的搜索()字符串
【发布时间】:2013-05-06 09:05:26
【问题描述】:

假设你有字符串,Black cat jack black cat jack black cat jack

您将如何使用search() 来查找单词jack 的第二次出现?

我猜代码看起来像:

var str = "Black cat jack black cat jack black cat jack";
var jack = str.search('jack');

但这只会返回字符串中第一次出现jack的位置。

【问题讨论】:

    标签: javascript string search


    【解决方案1】:

    你可以在循环中使用indexof method

    var pos = foo.indexOf("jack");
    while(pos > -1) {
         pos = foo.indexOf("jack", pos+1);
    }
    

    【讨论】:

    • 'someone has a nice jacket'.indexOf('jack'); //19
    • 我认为这样简单的任务不需要正则表达式。你也不知道他需要什么界限。更不用说您的解决方案不适用于千斤顶之类的词。如果需要边界,他可以检查找到的单词之后的下一个符号。
    • 好吧,它可以很容易地用正则表达式解决,而在不明确知道边界的情况下使用indexOf 是不可能的,或者多次调用indexOf 是非常低效的。 indexOf 的解决方案很简单,但在我看来太天真了。
    【解决方案2】:

    使用建议

    请注意,String.search 方法适用于 RegExp - 如果您提供一个字符串,那么它将隐式将其转换为 RegExp。它或多或少与RegExp.test 有相同的用途,您只想知道字符串中是否与RegExp 匹配。

    如果你想搜索固定字符串,那么我建议你坚持使用String.indexOf。如果您真的想使用模式,那么您应该使用RegExp.exec 来获取所有匹配项的索引。

    String.indexOf

    如果您正在搜索固定字符串,则可以将恢复搜索的位置提供给String.indexOf

    str.indexOf(searchStr, lastMatch + searchStr.length);
    

    我添加searchStr.length 以防止重叠匹配,例如在abababacccc 中搜索abab,如果我添加searchStr.length,将只找到1 个匹配项。如果您想查找所有匹配项,请将其更改为 + 1,而不管是否重叠。

    完整示例:

    var lastMatch;
    var result = [];
    
    if ((lastMatch = str.indexOf(searchStr)) >= 0) {
        result.push(lastMatch);
    
        while ((lastMatch = str.indexOf(searchStr, lastMatch + searchStr.length)) >= 0) {
            result.push(lastMatch);
        }
    }
    

    RegExp.exec

    这是为了演示用法。对于固定字符串,请改用String.indexOf - 在固定字符串情况下,您不需要RegExp 的额外开销。

    RegExp.exec为例:

    // Need g flag to search for all occurrences
    var re = /jack/g;
    var arr;
    var result = [];
    
    while ((arr = re.exec(str)) !== null) {
        result.push(arr.index);
    }
    

    请注意,上面的示例将为您提供非重叠匹配。如果要查找重叠匹配项,则需要设置 re.lastIndex(不过,"jack" 没有这样的东西作为搜索字符串)。

    【讨论】:

      【解决方案3】:

      我想出了这个解决方案——递归地调用搜索和替换原始字符串的函数,直到找不到更多出现的单词:

      function ReplaceUnicodeChars(myString) {    
          var pos = myString.search("&#");
      
          if (pos != -1) {
              // alert("Found unicode char in string " + myString + ", position " + pos);
              unicodeChars = myString.substr(pos, 6);
              decimalChars = unicodeChars.substr(2, 3);
              myString = myString.replace(unicodeChars, String.fromCharCode(decimalChars));
           }
      
          if (myString.search("&#") != -1)
              // Keep calling the function until there are no more unicode chars
              myString = ReplaceUnicodeChars(myString);
      
          return myString;       
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2014-07-08
        • 1970-01-01
        • 2018-10-02
        相关资源
        最近更新 更多