Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中动态替换字符串_Javascript_Arrays_Regex - Fatal编程技术网

如何在javascript中动态替换字符串

如何在javascript中动态替换字符串,javascript,arrays,regex,Javascript,Arrays,Regex,我有这个字符串: var text1 = "Ferrari Mercedes Ferrari Android iPhone LG iPhone iOS"; //text1 could be anything 我有以下阵列: var cars = ['Toyota', 'BMW', 'Ferrari', 'Mercedes']; var phones = ['Nokia', 'Samsung', 'LG', 'iPhone']; // cars values are fixed, but num

我有这个字符串:

var text1 = "Ferrari Mercedes Ferrari Android iPhone LG iPhone iOS";
//text1 could be anything
我有以下阵列:

var cars = ['Toyota', 'BMW', 'Ferrari', 'Mercedes'];
var phones = ['Nokia', 'Samsung', 'LG', 'iPhone'];
// cars values are fixed, but number of array could be increased
我想用数组中具有相同值的一个单词/值替换
text1
中的每个单词,例如:

  • text1
    中的单词Ferrari将与
    汽车中的一个
    值匹配,因此它将被宝马、丰田或梅赛德斯随机替换,但不是Ferrari,也不是任何一款
    手机的
    值。(假设它被宝马随机替换)

  • 法拉利的第二个词也将被宝马取代

  • 但是
    text1
    中的Mercedes一词不能被宝马和梅赛德斯取代

  • 同样的术语也适用于
    text1
    中分类为
    phones

  • 我预计结果可能是:

  • text1=“宝马丰田宝马安卓诺基亚三星诺基亚iOS”

  • Android和iOS没有被替换,因为它们不在任何阵列列表中

  • 获取此信息的有效方法是什么?

    我将使用此工作流:

  • 为每个对象类型定义正则表达式:rxCars: \(丰田|宝马|法拉利|梅赛德斯)\gi
  • 获取给定文本的匹配项1
  • 定义JavasScript关联数组以包含Mathc/替换对
  • 遍历匹配项,检查关联数组。。。如果(AssociationArray[“toyota”!=null){} 如果是新的,请从cars数组中选择一个随机替换项,然后从cars数组中删除该项。 如果它已经存在,请跳过并继续下一个匹配
  • 检查每个匹配项后,遍历关联数组,对每个项执行替换

  • 希望这有帮助。

    这是一种方法

  • 随机生成两个介于1和阵列长度(汽车/电话)之间的“偏移”数字
  • 创建一个空的“映射器”散列来存储新旧名称的映射
  • 循环遍历cars数组中的所有索引值,使用key=cars[index]和value=cars[index+offset%cars.length]向“namemapper”添加一个值,这将确保每个旧名称都映射到一个不同的新名称
  • 对手机做同样的事情
  • 拆分“”上的字符串以获取单词数组(我称之为splitText)
  • 定义一个空的应答字符串,并且两者都=电话+汽车
  • 使用for循环访问splitText的每个值
  • 在这个for循环中,检查每个单词是否都在'both'数组中,可以使用第二个for循环访问数组中的每个字符串,并使用===
  • 如果是,请将映射器中与此键对应的值附加到答案字符串
  • 否则,将splitString值附加到回答字符串
  • 添加一个空格
  • 代码如下:

    var carOffset = Math.ceil(Math.random() * (cars.length-1));
    var phoneOffset = Math.ceil(Math.random() * (phones.length -1));
    var mapper = {};
    
    for(var i = 0; i < cars.length; i++){
        j = (i + carOffset) % cars.length;
        mapper[cars[i]]=cars[j];
    }
    for(var i = 0; i < phones.length; i++){
        j = (i + phoneOffset) % phones.length;
        mapper[phones[i]]=phones[j];
    }
    
    var splitText = text1.split(' ');
    var ansString = '';
    var both = cars + phones;
    for(var i = 0; i < splitText.length; i++){
        var flag = 0;
        for(var j = 0; j< both.length; j++){
            if(splitText[i]===both[j]){
                ansString += mapper[splitText[i]];
                flag += 1;
            }
        }
        if(flag === 0){
            ansString += splitText[i];
        }
        ansString += ' ';
    }
    
    var carOffset=Math.ceil(Math.random()*(cars.length-1));
    var phoneOffset=Math.ceil(Math.random()*(phones.length-1));
    var映射器={};
    对于(变量i=0;i
    好的,发布您的尝试。Stackoverflow不是帮助台。如果你不能让你的代码正常工作,试着做点什么,把你试过的代码发布出来。不,我还没有尝试过,我只是开始想象,把每个单词分成文本1,然后在正则表达式中循环,但是太多的正则表达式使我的笔记本电脑昨天运行速度变慢,大小写不同。。这只是我在朋友手机上看到游戏后的想象逻辑,我9岁了,所以我想我有很多像这样无用的想象,很抱歉问你喜欢吗this@GeorgeJempty我从来没有要求任何代码,我只是想帮助你们找到一个有效的方法来做到这一点(是工作流程还是流程图,是吗?)我的学校没有教这个雪人试图避免正则表达式,因为昨天我的笔记本电脑运行缓慢,而尝试了太多的正则表达式,不同的情况下,如果这是不可避免的,我会尝试正则表达式当你说“不同的情况下”,你的意思是使用模式替代情况?最后应该使用不区分大小写的模式://i。不,我的意思是,不同的程序我昨天尝试构建文本搜索,这一个完全不同的程序谢谢你的建议,我将尝试构建代码谢谢先生,我将尝试逻辑,我真的很感谢你花时间教我,谢谢对不起,我又看了一眼,不确定这正是你想要的。我会试着回复你…我想这个更新的解决方案现在确实回答了这个问题。我还没有尝试你的代码,现在就在我的脑海中运行它。我特别喜欢这个技术。我认为有两种方法可以进行字符串匹配模式,循环或正则表达式afaik从我在stackoverflow中的其他问题上读到的,我可能会在这一个问题上使用正则表达式,我需要更多的动态概率,谢谢你的帮助