【问题标题】:How to dynamically replace string in javascript如何在javascript中动态替换字符串
【发布时间】:2015-07-18 14:37:32
【问题描述】:

我有这个字符串:

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 中的每个单词替换为数组中具有相同值的单词/值之一,例如:

  1. text1 中的单词 Ferrari 将匹配 Cars 值之一,因此它将被随机替换为 BMWToyota Mercedes 但不是 Ferrari 也不是 phones 值之一。 (假设它被 BMW 随机替换)

  2. 第二个Ferrari字也将被BMW

  3. 取代
  4. 但是text1中的Mercedes字不能被BMWMercedes

  5. 代替
  6. 同样的术语也适用于text1 中分类在phones 中的词

  7. 我预计结果可能类似于:

text1 = "BMW Toyota BMW Android Nokia Samsung Nokia iOS";

  1. AndroidiOS 不会被替换,因为它们不在任何数组列表中。

得到这个的有效方法是什么?

【问题讨论】:

  • 好的,发布你的尝试。
  • Stackoverflow 不是帮助台。尝试一下,如果您的代码无法正常工作,请发布您尝试过的代码。
  • 不,我还没有尝试,我只是开始想象,拆分 text1 中的每个单词然后循环通过正则表达式,但是太多的正则表达式使我的笔记本电脑昨天运行缓慢,不同的情况..这只是我在朋友手机上看到游戏后的想象逻辑,我今年 9 岁,所以我想我有很多无用的想象,我很抱歉这样问
  • @GeorgeJempty 我从不要求任何代码,我只是想向你们寻求一种有效的方法来做到这一点(是工作流还是流程图,是吗?)我的学校还没有教这个

标签: javascript arrays regex


【解决方案1】:

这是一种方法。

  1. 在 1 和数组长度(汽车/电话)之间随机生成两个“偏移”数字
  2. 创建一个空的“映射器”哈希来存储新旧名称的映射
  3. 循环遍历汽车数组中的所有索引值,使用键 = cars[index] 和 value = cars[index + offset % cars.length] 向“namemapper”添加一个值,这将确保每个旧的名称被映射到一个不同的新名称
  4. 对手机做同样的事情
  5. 在 ' ' 上拆分字符串以获得单词数组(我称之为 splitText)
  6. 定义一个空的答案字符串和两者 = 电话 + 汽车
  7. 使用 for 循环访问 splitText 的每个值
  8. 在这个 for 循环中,检查每个单词是否在 'both' 数组中,您可以使用第二个 for 循环访问数组中的每个字符串并使用 === 检查是否相等
  9. 如果是,则将映射器中与此键对应的值附加到答案字符串中
  10. 否则,请将 splitString 值附加到您的答案字符串中
  11. 添加空格

代码如下:

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 += ' ';
}

【讨论】:

  • 谢谢先生,我会试试逻辑,非常感谢您花时间教我,谢谢
  • 抱歉,我又看了一遍,不确定这是否正是您想要的。我会尽力回复你...
  • 我认为这个更新的解决方案现在可以回答这个问题。
  • 我还没有尝试你的代码,只是现在在我的脑海中运行它我喜欢这项技术,尤其是#3。我认为有两种方法可以进行字符串匹配模式,循环或正则表达式 afaik 从我在 stackoverflow 中的其他 quostions 中读到的内容,我可能会在这个上进行正则表达式,我需要更多动态概率,谢谢你的帮助
【解决方案2】:

我会使用这个工作流程:

  1. 为每个对象类型定义您的 RegEx:rxCars: \(丰田|宝马|法拉利|梅赛德斯)\gi
  2. 获取给定文本的匹配项1
  3. 定义一个 JavaScript 关联数组以包含数学/替换对
  4. 遍历匹配项,检查关联数组... if (associativeArray["toyota"] != null){} 如果它是新的,则从 cars 数组中选择一个随机替换项目,然后从 cars 数组中删除该项目。 如果已经存在,请跳过并继续下一场比赛。
  5. 检查完每个匹配项后,遍历关联数组,对每个项目执行替换。

希望这会有所帮助。

【讨论】:

  • 我尽量避免使用正则表达式,因为昨天我的笔记本电脑运行缓慢,同时尝试了太多正则表达式,不同的情况下,如果不可避免,我会尝试正则表达式
  • 当您说“使用不同的大小写”时,您的意思是使用替代大小写的模式吗?应该使用不区分大小写的模式: //i at end.
  • 不,我的意思是,我昨天尝试构建文本搜索的不同程序,这是完全不同的程序
  • 感谢您的建议,我会尝试构建代码
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2011-12-08
相关资源
最近更新 更多