当前位置: 首页 > 面试题库 >

JavaScript有效替换字符串中的所有重音字符?

慕容成文
2023-03-14
问题内容

对于穷人在客户端上实现近似排序规则正确排序的实现,我需要一个JavaScript函数,该函数可以 有效地 替换字符串中的单个字符。

这就是我的意思(请注意,这适用于德语文本,其他语言则有不同的排序方式):

本机排序弄错了:abcouzäöü
正确的排序规则是:aäbcoöuüz

基本上,我需要将给定字符串的所有出现的“ä”替换为“ a”(依此类推)。这样,本机排序的结果将非常接近用户的期望(或数据库将返回的结果)。

其他语言也具有执行此操作的功能:Python提供str.translate(),在Perl中tr/…/…/,XPath具有功能translate(),ColdFusion具有ReplaceList()。但是JavaScript呢?

这就是我现在所拥有的。

// s would be a rather short string (something like 
// 200 characters at max, most of the time much less)
function makeSortString(s) {
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  var translate_re = /[öäüÖÄÜ]/g;
  return ( s.replace(translate_re, function(match) { 
    return translate[match]; 
  }) );
}

对于初学者,我不喜欢每次调用该函数都会重新构建正则表达式的事实。我猜闭包可以在这方面有所帮助,但是由于某种原因,我似乎没有把握住它。

有人能想到更有效的方法吗?


问题答案:

我无法说出您要针对函数本身专门做什么,但是如果您不喜欢每次都构建正则表达式,则这里有两个解决方案,以及每个注意事项。

这是执行此操作的一种方法:

function makeSortString(s) {
  if(!makeSortString.translate_re) makeSortString.translate_re = /[öäüÖÄÜ]/g;
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  return ( s.replace(makeSortString.translate_re, function(match) { 
    return translate[match]; 
  }) );
}

显然,这会使正则表达式成为函数本身的属性。您对此可能不喜欢的唯一事情(或者您可能会猜到这取决于情况)是,现在可以在函数主体外部修改正则表达式。因此,有人可以这样做来修改相互使用的正则表达式:

makeSortString.translate_re = /[a-z]/g;

因此,有一个选择。

一种获得闭包(从而防止某人修改正则表达式)的方法是将其定义为匿名函数分配,如下所示:

var makeSortString = (function() {
  var translate_re = /[öäüÖÄÜ]/g;
  return function(s) {
    var translate = {
      "ä": "a", "ö": "o", "ü": "u",
      "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
    };
    return ( s.replace(translate_re, function(match) { 
      return translate[match]; 
    }) );
  }
})();

希望这对您有用。

更新:还很早,我不知道为什么以前看不到明显的东西,但是将translate对象也放在闭包中也可能很有用:

var makeSortString = (function() {
  var translate_re = /[öäüÖÄÜ]/g;
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  return function(s) {
    return ( s.replace(translate_re, function(match) { 
      return translate[match]; 
    }) );
  }
})();


 类似资料:
  • 问题内容: 我有一个字符串,我想用一个星号替换任何不是标准字符或数字的字符,例如(az或0-9)。例如,“ h ^&ell`。,| ow] {+ orld”被替换为“ h * ell * o * w * orld”。请注意,多个字符(例如“ ^&”)将替换为一个星号。我将如何去做呢? 问题答案: 正则表达式可以解救! 例:

  • 问题内容: 如何替换字符串中所有出现的内容? 如果要替换字符串中的所有换行符(\ n)。 这只会替换第一次出现的换行符 我不知道该怎么做? 问题答案: 使用全局标志。

  • 问题内容: 我有这个字符串: 正在做: 似乎只删除了上面字符串中的第一个匹配项。 如何替换 所有 出现的内容? 问题答案: 注意:请勿在对性能有要求的代码中使用此代码。 作为简单文字字符串的正则表达式的替代方法,您可以使用 一般模式是 在某些情况下,它过去比使用和正则表达式要快,但是在现代浏览器中,情况似乎不再如此。 结论:如果您有性能至关重要的用例(例如,处理数百个字符串),请使用Regexp方

  • 问题内容: 我正在编写一个小型JAVA程序,该程序: 将文本作为字符串 需要2个字符数组 我试图做的事情听起来像是“查找并替换”,但是并不相同,因此我认为清除它很重要。 无论如何,我想获取此文本,查找第一个数组中的任何字符是否与文本中的字符匹配,如果是,则将其替换为第二个字符数组中的匹配字符(根据索引)。 我将举一个例子来说明:假设我的文本(字符串)是:“ java很棒!”;我有2个数组(char

  • 这应该只得到数字和返回,但不做它作为预期的!有什么建议吗?

  • 我正在寻找在javascript或jquery中更改字符串中所有字符的最佳和最快的方法 例如: abcdefghijklmnopqrstuvwxyz==>aximi、fixi、fixi、fixi、fixi、fixi、fixi、fixi、fixi、fixi、fixi、fix 或 abcdefghijklmnopqrstuvwxyz==>å¡Á¡ãghïjklmñãqr§µvwx¡ãz ...。 输出