【问题标题】:Parsing Through Text in JavaScript在 JavaScript 中通过文本解析
【发布时间】:2014-06-02 11:52:00
【问题描述】:

我正在编写一个将文本作为输入的函数,并在文本中执行替换。例如,我查找“blue”的所有实例并将其替换为“red”。我使用正则表达式来检测我正在寻找的字符串,该字符串由 (text).replace 函数使用。问题是我做了很多 text.replace,我想要一种逐个字符串解析文本字符串的方法,如果它匹配我想要的任何内容,我将执行替换(而不是寻找“整个文本中的蓝色”,然后整个文本中的“绿色”,依此类推)。我相信这会更有效率,但我该怎么做呢?

提前致谢。

【问题讨论】:

    标签: javascript regex parsing


    【解决方案1】:

    您也可以使用正则表达式来做到这一点,并通过回调查找多个子字符串以用相同的正则表达式替换每个子字符串。

    这将扫描字符串一次,但回调当然会降低效率,具体取决于您在回调中执行的操作。

    text = text.replace(/(blue|red|green)/g, function(x) {
        var ret = '';
        switch (x) {
            case 'blue' : 
                ret = 'azul';
                break;
            case 'green' : 
                ret = 'verde';
                break;
            case 'red' : 
                ret = 'rojo';
                break;
            default : 
                ret = 'color';
        }
        return ret;
    });
    

    有点冗长,但你明白了。
    这可以扩展,例如使用地图进行替换

    var replacements = {
        'blue' : 'azul', 
        'green': 'verde',
        'red'  : 'rojo'
    }
    
    var reg = new RegExp('(' + Object.keys(replacements).join('|') + ')','g');
    
    text = text.replace(reg, function(x) {
        return replacements[x];
    });
    

    【讨论】:

    • return ({"blue":"azul","green":"verde","red:"rojo"})[x] || "color"; 不那么冗长。
    • @BenjaminGruenbaum - 事实上,具有匹配键的对象会不那么冗长,我也将添加它作为示例,我只是输入了非常冗长的内容。
    • 没有理由使用OR。如果它进入函数,总会有一个匹配。
    • @BenjaminGruenbaum - 我做的有点不同,我猜仍然很冗长,但是当对象改变时,正则表达式会自动更新!
    • 当然可以,只要正则表达式有效,您就可以真正搜索任何内容,并且管道 (|) 是正则表达式中的 OR,分隔要搜索的短语等.
    【解决方案2】:

    您可以有一个匹配所有字符串的正则表达式,并使用替换函数根据匹配执行特定操作。

    'redgreenblue'.replace(/red|green|blue/g, function (color) {
        switch (color) {
            case 'red': return 'RED';
            case 'green': return 'GREEN';
            case 'blue': return '';
        }
    });
    

    【讨论】:

    • 从来没有想过替换方法会这样工作。先生,您是一位学者。谢谢
    【解决方案3】:

    我认为使用正则表达式是最好的方法,浏览器已针对它们进行了优化,其他解决方案可能会使您的代码更加复杂。

    var text = "this is a test";
    
    var replacements = { 'this': 'that'};
    
    for (var source in replacements){
        var target = replacements[source],
            expression = new RegExp(source,"g");
        text = text.replace(expression, target);
    }
    

    【讨论】:

      【解决方案4】:

      其他人更快。无论如何,这是我的建议(略有不同,但与其他人已经写过的想法相同),使用替代作为正则表达式,并使用具有哈希访问的函数进行替换:

      var text = "...";
      
      var words = { "red":"FF0000", "green":"00FF00", "blue":"0000FF", "yellow":"FFFF00", ... };
      
      var pattern = new RegExp( Object.keys(words).join("|"), "g" );
      
      var newText = text.replace( pattern, function(match) {
        return words[match]
        });
      

      看到它在http://ideone.com/RsuxJW上工作

      【讨论】:

        猜你喜欢
        • 2020-12-31
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多