用javascript替换多个字符

时间:2016-09-29 08:21:09

标签: javascript replace

目前我正在用一些不同的角色替换一个角色,因为它是一个需要改变的乐谱,角色可能会有所不同。因此,我创建了一个JavaScript代码,如果在工作表上,它将替换所有这些字母。

这里出现问题,如果我有字符A需要用C替换,稍后在同一个JavaScript代码中C需要用D替换。因此A改为D而不是C.我需要替换每个字符每次操作一次,而不是将替换的文本与其他可能性进行比较。

到目前为止,这是我的代码:

function Dkoord() {
  $('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
    return text.replace('A', 'B').replace('A#', 'C').replace('Bb', 'C')
               .replace('B', 'C#').replace('C', 'D').replace('C#', 'D#')
               .replace('Db', 'Eb').replace('D', 'E').replace('D#', 'F')
               .replace('Eb', 'F').replace('F', 'G').replace('F#', 'G#')
               .replace('Gb', 'Ab').replace('G', 'A').replace('G#', 'A#')
               .replace('Ab', 'Bb');
});
}

正如你所看到的,C正在改变为D但后来将D改为E,我只想要一个角色进行一次比较。我该怎么做。

3 个答案:

答案 0 :(得分:5)

使用一个正则表达式来匹配您要替换的内容,如下所示:

/[A-G](b|#)?/g

即匹配来自A-G的任何字母,可选地后跟b或#。

然后使用.replace() with a callback查找匹配的内容并返回相应的替换。

function Dkoord() {
  var replacements = {
      'A': 'B', 'A#': 'C', 'Bb': 'C', 'B': 'C#', 'C': 'D', 'C#': 'D#',
      'Db': 'Eb', 'D': 'E', 'D#': 'F', 'Eb': 'F', 'F': 'G', 'F#': 'G#',
      'Gb': 'Ab', 'G': 'A', 'G#': 'A#', 'Ab': 'Bb'
  };

  $('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
    return text.replace(/[A-G](b|#)?/g, function(m) { return replacements[m]; });
  });
}

展开并运行以下代码段以获得简化演示:

function Dkoord(text) {
  var replacements = {
      'A': 'B', 'A#': 'C', 'Bb': 'C', 'B': 'C#', 'C': 'D', 'C#': 'D#',
 	  'Db': 'Eb', 'D': 'E', 'D#': 'F', 'Eb': 'F', 'F': 'G', 'F#': 'G#',
	  'Gb': 'Ab', 'G': 'A', 'G#': 'A#', 'Ab': 'Bb'
  };
    	  
  return text.replace(/[A-G](b|#)?/g, function(m) { return replacements[m]; });
}

console.log(Dkoord("A# B C D/F# G A"))

请注意,使用这样的查找对象还有一个优点,即您可以将其扩展为具有多个对象以允许转置到不同的键中。例如,如果从B大调转换为C#,您应该将D#更改为E#,但如果将F#major转换为Ab,则应将D#更改为F.

答案 1 :(得分:2)

这样做的一个简单方法是用临时值替换初始值,然后再次替换临时变量。

例如:

function Dkoord() {
  $('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
    return text.replace('A', 'b').replace('A#', 'c').replace('Bb', 'c')
               .replace('B', 'c#').replace('C', 'd').replace('C#', 'd#')
               .replace('Db', 'e_').replace('D', 'e').replace('D#', 'f')
               .replace('Eb', 'f').replace('F', 'g').replace('F#', 'g#')
               .replace('Gb', 'a_').replace('G', 'a').replace('G#', 'a#')
               .replace('Ab', 'b_').toUpperCase().replace(/[_]/g, "b");
  });
}

这将使用小写的“正确”值替换所需的文本,这将阻止下一个管道替换已替换的值。

完成后,您可以浏览字符串并简单地将所有内容设置为大写。所以,只需在上次replace之后添加。

.toUpperCase().replace(/[_]/g, "b");

显然,你可以使用任何你想要的角色,只要它是唯一的。

演示

$("#btn").on("click", function() {
  $("#demo").text(function(i, text) {
    return text.replace('A', 'b').replace('A#', 'c').replace('Bb', 'c')
      .replace('B', 'c#').replace('C', 'd').replace('C#', 'd#')
      .replace('Db', 'e_').replace('D', 'e').replace('D#', 'f')
      .replace('Eb', 'f').replace('F', 'g').replace('F#', 'g#')
      .replace('Gb', 'a_').replace('G', 'a').replace('G#', 'a#')
      .replace('Ab', 'b_').toUpperCase().replace(/[_]/g, "b");
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<b id="demo">AC#Eb</b>
<button id="btn">Convert</button>

答案 2 :(得分:0)

尝试这样的事情

 function Dkoord() {

     $('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {

      return text.replace('Ab', 'Bb').replace('G#', 'A#').replace('G', 'A')
            .replace('Gb', 'Ab').replace('F#', 'G#').replace('F', 'G')
            .replace('Eb', 'F').replace('D#', 'F').replace('D', 'E')
            .replace('Db', 'Eb').replace('C#', 'D#').replace('C', 'D')
            .replace('B', 'C#').replace('Bb', 'C').replace('A#', 'C')
            .replace('A', 'B')
 });
 }