第一次替换后如何停止替换字母?

时间:2018-08-26 19:18:34

标签: javascript html regex

所以我有以下代码:

cabc
var input = document.querySelector("input");
var h1 = document.querySelector("h1");

input.addEventListener("input", function(e){
  h1.innerText = input.value.replace(/[a]/gi, 'e').replace(/[e]/gi, 'i').replace(/[i]/gi, 'o').replace(/[o]/gi, 'u').replace(/[u]/gi, 'y')
});

如您所见,如果我按“ a”,它将用“ e”替换“ a”。但是,这就像一个多米诺骨牌效应:它现在检测到“ e”,并将其替换为“ i”,依此类推,直到达到“ y”。我该如何预防?

注意::我不太擅长正则表达式,所以请尝试解释一下。

3 个答案:

答案 0 :(得分:2)

如果交换 entity_id | owner_id | title | entity_type | property_value ---------------------------------------------------------------- 4 | 5 | title 1 | type_1 | 0 5 | 5 | title 2 | type_2 | 1 6 | 5 | title 3 | type_3 | 1 链,它将起作用,而是以SELECT sought.*, entity_properties.property_value FROM entity AS sought INNER JOIN entity AS entity_type JOIN entity_properties AS properties ON properties.entity_id = entity_type.entity_id WHERE sought.owner_id = 5 AND sought.entity_type IN( 'type_1', 'type_2', 'type_3') AND properties.property_key = 'is_cool' 开头并以replace()结束

堆栈片段

.replace(/[u]/gi, 'y')
.replace(/[a]/gi, 'e')

答案 1 :(得分:2)

而不是使用无尽的.replace()链,

  • 创建替代库
  • 将lib Keys 加入到q ueregExp /(a|e|i|o|u)/
  • 使用.replace() 一次来娱乐和获利

var input = document.querySelector("input");
var h1 = document.querySelector("h1");


var lib = {
  'a':'e',
  'e':'i',
  'i':'o',
  'o':'u',
  'u':'y',
};


input.addEventListener("input", function(e){

  var q = new RegExp("("+ Object.keys(lib).join('|') +")", "ig");
  h1.textContent = this.value.trim().replace(q, $1 => lib[$1]);
  
});
<input type="text">
<h1></h1>

工作方式:

String.prototype.replace() method提供了一个回调函数,您可以在其中的参数中为正则表达式匹配 ()←匹配组提供别名。我们只对第一个也是唯一的一组($1)感兴趣。
在回调内部,我们用替换lib rary中的字符替换匹配的字符出现。

为使其更易于理解,这是扩展版本:

//...

input.addEventListener("input", function(e){

  var characterKeys = Object.keys(lib).join('|'); // "a|e|i|o|u"
  var matchGroup = "("+ characterKeys  +")";      // "(a|e|i|o|u)"
  var reg = new RegExp(matchGroup , "ig");
  // meaning: Match any of the characters present in the group
  // (the | is the options delimiter).

  // Finally: 
  var inputVal = this.value.trim();
  var replacedText = inputVal.replace( reg , function(match1) {
     return lib[ match1 ];
  });

  h1.textContent = replacedText;

});

return lib[ match1 ]的作用很简单:

如果在对字符串进行正则表达式解析时遇到"e"字符,return是库替换,在这种情况下lib[ "e" ] === "i"因此在该位置插入了字符"i"回调点。

另外,请了解Object/keys

答案 2 :(得分:1)

您需要撤消替换顺序。

既然结束了(y不会被替换),则可以先用y替换u,用u替换o,以此类推。