除了AND外,将所有单词转换为小写

5
我正在寻找最快的方法,以小写所有不属于“AND”短语中的字母。我希望留下“AND”的原始大小写,无论它是“and”还是“AND”都不应更改。
例如,“barack AND obama”应该等同于“Barack AND Obama”,但不等于“barack and obama”(注意“and”中的大小写差异)。
以下是一种方法,但我想知道是否有更短的方式或者一种避免使用迭代器的方式:
var str = 'Barack AND Obama'; // should be barack AND obama after
str = str.split(/\s+/g).map(function (s) {
    return s.toLowerCase() != 'and' ? s.toLowerCase() : s;
}).join(' ');
2个回答

8

您可以使用负向前瞻将除了“AND”以外的每个单词转换为小写:

str = str.replace(/\b(?!AND).+?\b/g, function(s) {
  return s.toLowerCase();
});

好的方法!在我选择最佳之前,我也对其他方法感兴趣。 - Brian Cray
我见过它被用来进行伪后顾查找。这可能是解决我的问题最优雅的方法。 - Brian Cray
@BrianCray,你可以通过将.+?改为\w+来提高性能。这样可以避免回溯,并且避免匹配非单词字符(如空格),这些字符现在被匹配,但toLowerCase不会改变它们。 - Martin Ender
@m.beuttner 兴趣 - .+? 如何回溯? - Brian Cray

2

我认为pimvdb的解决方案最优雅,但是为了多样性,这里还有另一个解决方案。

var str = 'Barack AND Obama';
var arr = str.split(' ');
for(var i=0;i<arr.length;i++){
  if (arr[i] != 'AND'){
    arr[i] = arr[i].toLowerCase();
  }
}
var ans = arr.join(" ");

这种方法不太优雅,但我发现它稍微更易于人类阅读,并且如果将来需要修改,比如添加到不应小写的单词列表中,也更容易。


你在那里没有使用 split,我想你的意思是要使用 split(' ') - Brian Cray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接