【问题标题】:"Simple" Text replace function“简单”文本替换功能
【发布时间】:2010-03-23 19:17:23
【问题描述】:

我有一个字符串,它基本上是由逗号分隔的“单词”列表。这些“单词”几乎可以是任何字符,例如“巴特辛普森,前女友,老兄,激进”

我正在尝试使用 javascript、jQuery、whatever 我可以将基于搜索字符串的单词替换为空(实质上是从列表中删除单词)。

例如函数定义如下:function removeWord(myString, wordToReplace) {...};

因此,将上面列出的字符串传递为 myString 并将“dude”传递为 wordToReplace 将返回字符串“Bart Simpson,前女友,激进”

这是我正在修改的代码行...请帮助我找出它的问题或其他(更好的)解决方案:
$myString.val($myString.val().replace(/wordToReplace\, /, ""));

【问题讨论】:

    标签: javascript jquery regex string replace


    【解决方案1】:

    没有必要像现在这样使用正则表达式。相反,如果有的话,我会将字符串拆分为标记并删除与搜索词匹配的标记:

    function removeWord(myString, wordToReplace)
    {
        var tokens = myString.split(/\s*,\s*/);  // allow for whitespace around the comma
        var index = $.inArray(wordToReplace, tokens);  
    
        if (index != -1)
        {
            tokens.splice(index, 1);
        }
    
        return tokens.join(", "); // Assumes you want a space after each comma
    }
    
    var s = "Bart Simpson, Ex-girlfriend, dude, radical";
    removeWord(s, "dude"); // returns "Bart Simpson, Ex-girlfriend, radical
    

    如果您要搜索的字符串可能包含重复项,您可以使用该函数的更改版本(indexOf 仅返回第一个索引,因此需要循环查找所有这些项) :

    function removeWord(myString, wordToReplace)
    {
        var tokens = myString.split(/\s*,\s*/);
        var index;
    
        while ((index = $.inArray(wordToReplace, tokens)) != -1)
        {
            tokens.splice(index, 1);
        }
    
        return tokens.join(", ");
    }
    
    var s = "Bart Simpson, Ex-girlfriend, dude, radical, dude";
    removeWord(s, "dude"); // returns "Bart Simpson, Ex-girlfriend, radical
    

    【讨论】:

    • 当我运行此代码时,我在调用 indexOf 时收到“对象不支持此属性或方法”错误。当我 alert(tokens) 它返回删除空格的字符串。就像 split 不返回数组一样?我可以指定类型以强制它返回一个吗?以某种方式投射?
    • String.split 是一个内置的 Javascript 函数,它返回一个数组。您是否有可能在某处覆盖了String.prototype.split
    • 嗯,jQuery 包含在这个项目中,所以也许它使用了 jQuery 拆分?
    • 您使用的是什么版本的 jQuery?我用 1.3.2 试了一下,效果很好。据我所知,jQuery 没有定义自己的 String.split。 alert(String.split) 的输出是否包含 [native code](在 firefox 中)或函数定义?
    • 我在 Firefox 中进行了检查,是的,它确实返回了 [native code],但是,这在 IE7 中被炸毁了。 IE7的indexOf有问题吗?
    【解决方案2】:

    不是为健壮性而构建的,但这可以满足您的需求。

    function removeWord(myString, wordToReplace)
     {
        return myString.replace(wordToReplace+", ", "");
     };
    
     var s = "Bart Simpson, Ex-girlfriend, dude, radical" ; 
     s = removeWord(s, "dude") ; // "Bart Simpson, Ex-girlfriend, radical"
    

    【讨论】:

    • 如果要替换的单词是列表中的最后一个元素,则失败。
    • 这有两个问题:首先,它不会匹配列表中的最后一项,因为它后面没有逗号;其次,它会匹配一个子字符串(例如,如果列表包含'goodbye'并且要替换的单词是'bye',它会在再见时抓住再见)。
    • 我同意。丹尼尔的解决方案更好。但是,提问者想知道他们的代码出了什么问题,这是让他们的代码正常工作的最简单方法(并声明它还不够健壮)。
    【解决方案3】:

    如果你仍然想使用正则表达式,你可以试试这个:

    function removeWordFromList(str, word) {
        return str.replace(
            new RegExp("(^|,\\s*)" + escape(word) + "(\\s*,\\s*|$)", "g"),
            "$1") // remove the word
          .replace(/\s*,\s*$/, ""); // remove the trailing comma
    }
    

    不过,如果您想操作您的列表,将字符串拆分为一个数组会更直观、更好。

    【讨论】:

    • 我在 IE7 中遇到了这个解决方案的问题。出于某种原因,使用 jQuery 修剪功能不会摆脱所有尾随空格!所以这个函数永远不会匹配传入的单词,因为尾随空格......在 Firefox 中运行良好。
    【解决方案4】:
    var text = ",Bart Simpson ,, ,  Ex-girlfriend, 5 dude ,radical, sth,, dolr, ";
    
    function removeWord(source, word)
    {
      return source
        // replace multiple delimiters into one
        .replace(/\s*,[\s*,]*/g, ', ')
        // trim delimiters
        .replace(/^,\s*|,\s*$/g, '')
        // replaces the substring
        .replace( new RegExp('(^|,\\s)'+word+'($|,\\s)'), function(match, left, right) {
          left = left.trim(), right = right.trim();
          return (left+right).length !== (left.length || right.length) ? ', ': '';
        });
    }
    
    removeWord(text,'5 dude');
    

    应该带类似的东西

    "Bart Simpson, Ex-girlfriend, radical, sth, dolr"
    

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2019-02-04
      • 2010-09-13
      相关资源
      最近更新 更多