【问题标题】:Replace words in text替换文本中的单词
【发布时间】:2017-05-31 12:00:12
【问题描述】:

我正在编写 Web 应用程序的一部分,我在其中替换文本中的单词。我使用了替换功能,但我替换了我不想要的文本(下面放一个例子)。现在我已经实现了一个功能,通过将文本拆分为单词,但是当我想替换文本中的两个连续单词时。显然,它不起作用。

第一个选项:

var str = "iRobot Roomba balbalblablbalbla";

str.replace(/robot/gi, 'Robota');

output -> iRobota Roomba ........(fail !)

第二个代码:

var patterns: [ 
    {
        match: 'robot',
        replacement: 'Robota'
    },{
        match: 'ipad',
        replacement: 'tablet'
    },
    ......... more
];

var temp = str.split(' ');

var newStr = temp.map(function(el) {

    patterns.forEach(function(item) {

        if( el.search( new RegExp( '^'+item.match+'$', 'gi') ) > -1 ) {

            el = item.replacement;

            return el;
        }
    });

    return el;
});

return newStr.join(' ');

最后一个代码不会替换两个单词的文本,因为检查只会生成一个。我一直在互联网上寻找一些解决方案,但我没有找到类似的东西。

我只是碰巧对单词进行了拆分检查(item.match),如果它有多个元素,则创建一个时间变量并检查连续元素,但我猜它会影响性能,我不知道如果有更好更简单的选择。

谁能想到更好的选择?

谢谢!

【问题讨论】:

    标签: javascript regex performance


    【解决方案1】:

    据我了解,您只想匹配整个单词而不是子字符串。

    解决方案是在您的正则表达式中添加单词边界:

    str.replace(/\brobot\b/gi, 'Robota');
    

    这只会匹配整个“机器人”单词。

    【讨论】:

    • 正常工作。几分钟前我在尝试类似的东西,因为我在 StackOverflow 中看到了推荐,但没有用 \\b 转义。谢谢 !! ;-)
    • 它有效,但效率不高。想象一下对于具有 n 个模式的大型字典的相同情况:您需要解析整个字符串 n 次,并且可能要搜索甚至不在文本中的单词!
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多