使用JavaScript将字符串转换为标题大小写


548

有没有简单的方法可以将字符串转换为标题大小写?例如john smith变为John Smith。我不是在寻找像John Resig的解决方案那样复杂的东西,只是(希望)某种一线或两线。


有多种方法,我们有一些性能统计信息吗?
theAnubhav

请选择这个简短的答案stackoverflow.com/a/57689168/10373693 我希望这将是您正在寻找的答案。
Abhishek Kumar

Answers:


738

尝试这个:

    function toTitleCase(str) {
        return str.replace(
            /\w\S*/g,
            function(txt) {
                return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
            }
        );
    }
<form>
Input:
<br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)"  onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
<br />Output:
<br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>


14
任何人都可以请解释一下,为什么\w\S*使用,代替\w+\w*为例子吗?我不知道,为什么您要不包含空格,然后将Jim-Bob更改为Jim-bob
martinczerwi 2013年

5
@martinCzerwi \w\S*也导致了Jim-bob我们这一问题。使用\w*解决了这个。
Bouke

14
/([^\W_]+[^\s-]*) */g解决了这个Jim-Bob问题,即:jim-bob --> Jim-Bob
recursion.ninja

15
如果jim-bob --> Jim-Bob您愿意,则可能应该这样做/\b\w+/g。示例:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
vol7ron

3
\w\S*用代替\w+或,\w*这样诸如的词Don't就不会被修改为Don'T,但是正如其他人指出的那样,\w\S*会导致带有连字符的词出现问题。
doubleDown '17

198

稍微更优雅的方式,可以适应Greg Dean的功能:

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

像这样称呼它:

"pascal".toProperCase();

3
请记住,如果你有他们的名字破折号用户都进去Jo-Ann Smith,这个代码将其转换为Jo-ann Smith(注意是小写aAnn)。
dbau 2012年

18
@daniellmb为什么他不应该更改String原型?我认为这是一个很好的解决方案。考虑一下ruby开放类,将函数添加到现有类中是完全有效的,并且被广泛接受。
marco-fiset 2012年

97
@ marco-fiset因为与他人的配合不好!当您有2个库都试图用不兼容的更改来修改本机JavaScript对象时,就会发生不好的事情。想象一下,如果jQuery和Google Maps遵循这种设计模式,那么您不可能在同一页面上同时拥有这两种设计。
daniellmb

5
@daniellmb一个很好的观点。前缀方法名称应有助于避免这种情况,因为这将使方法不可枚举。
mikemaccana

60
我觉得“不要修改本地JavaScript对象”语句就像“从不使用goto”或“ eval是邪恶的”一样。在很多情况下都可以。如果您完全控制您的项目,并且当然不打算将其作为库发布,那么我认为这种方法没有问题。
FoxMulder900

175

尝试将文本转换的 CSS样式应用于控件。

例如: (text-transform: capitalize);

仅在绝对必要时使用JS方法。


36
-1。此CSS可以工作,但不能像大多数人所期望的那样工作,因为如果文本以全部大写字母开头,则没有任何效果。 webmasterworld.com/forum83/7506.htm
whitneyland 2011年

2
@Akshar:小写规则将替换为标题大小写规则。由于css不会修改源内容,因此其效果是删除了小写规则(将源内容保留在所有大写形式),然后将应用标题大小写规则(不执行任何操作)。
dokkaebi,2012年

42
JS用于外部浏览器。
mikemaccana

4
问题是:“有没有简单的方法可以将字符串转换为标题大小写?” 。此答案不会转换字符串。这是应用于字符串顶部的样式。
kingPuppy

如果您希望数据库中的数据是干净的,以便在传递给第三方服务或导出为CSV时可以干净地使用它们,那么CSS并不是真正的选择。CSS是用于化妆品的,尽管它已经发展了许多年,您可以使用它来解决这类问题,但是解决方案仍然是化妆品,它不能解决根本的问题。
亚当·赖斯

118

这是我的版本,IMO也很容易理解和优雅。

var str = "foo bar baz"

console.log(

str.split(' ')
   .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
   .join(' ')

)
// returns "Foo Bar Baz"


3
或者,您可以在映射中小写子字符串:str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
Dave Land

5
我不同意打电话.toLowerCase()。诸如“ McDonald”的名称或诸如“ ASAP”的缩写应保留其大写字符。如果有人实际上传入了类似“ heLLO”的字符串,则应用程序不应假定大写字母不正确。
Thomas Higginbotham'2

1
@ThomasHigginbotham怎么样? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
肖恩·肯德尔

是的,最好提供一个强制小写的选项。
Thomas Higginbotham'2

1
如果str是单个字符,则会中断。
Madbreaks

103

这是我的函数,它可以转换为标题大小写,但还保留定义的首字母缩写词为大写,次要单词保留为小写:

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

例如:

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

1
我喜欢您的,在处理罗马数字时也遇到问题...只是用I,II,III,IV等对其进行了修补
Marcelo

2
固定。在第三行的正则表达式已经从改变/\w\S*/g/([^\W_]+[^\s-]*) */g每@ awashburn的评论上述解决这一问题。
Geoffrey Booth 2013年

2
通过使用您的regex模式/\b\w+/g,可以获得一个优势,我发现它更容易理解?
Michael-Clay Shirky在哪里,

2
我没看到,我只是在接受另一个评论者的建议来解决连字问题。但是您的正则表达式看起来也一样,并且简单性总是更好。对于后代和未来的游客到这个帖子,我只是改变了正则表达式中的第三行从/([^\W_]+[^\s-]*) */g/\b\w+/g每@迈克尔的评论; 如果发现需要更复杂的正则表达式的情况,请发表评论。
杰弗里·布斯

1
我将第三行正则表达式改为/\b[\w-\']+/g,以允许带连字符的单词和单词中的撇号。
Shamasis Bhattacharya 2014年

47

与其他答案相比,我更喜欢以下内容。它仅匹配每个单词的第一个字母并将其大写。代码更简单,更易于阅读且字节更少。它保留现有的大写字母,以防止首字母缩写词失真。但是,您始终可以toLowerCase()先调用字符串。

function title(str) {
  return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

您可以将其添加到字符串原型中,这将使您可以执行'my string'.toTitle()以下操作:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

例:


3
作为lambda甚至更好const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
0xcaff

我不想破坏IE,但如果应用程序对旧版浏览器不敏感,它可能会更短。
汤姆·凯

这只是部分解决方案-op询问如何将字符串转换为标题大小写。对于类似的输入,此答案无法实现NoT qUiITe
Madbreaks

@Madbreaks该问题并未规定应转换混合大小写的输入。但是,我已经更新了提及的答案toLowerCase。请注意,这会破坏首字母缩写词。an HTML documentAn HTML DocumentvsAn Html Document
汤姆·凯

4
@Madbreaks虽然您的第一个示例是人为设计的,但您可以指出,如果将输入大写,则输出将保持不变。话虽这么说,我认为答案(按修改建议toLowerCase)比假定开发人员意图的答案更灵活/有用。此方法还反映了其他语言(例如PHP(ucwords)和Golang(strings.Title))的类似内置方法的功能。TextInfo.ToTitleCase有趣的是,.NET()适用于大小写混合的情况,但也会保留完全大写的字符串不变。
汤姆·凯

20

不使用正则表达式仅供参考:

String.prototype.toProperCase = function() {
  var words = this.split(' ');
  var results = [];
  for (var i = 0; i < words.length; i++) {
    var letter = words[i].charAt(0).toUpperCase();
    results.push(letter + words[i].slice(1));
  }
  return results.join(' ');
};

console.log(
  'john smith'.toProperCase()
)


感谢您提供的正则表达式免费解决方案!
lucifer63

20

var result =
  'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())

console.log(result) // This Is Very Interesting


只是一个问题,()构造用于在一系列选项中的任何一个上指定匹配项:即(a | b)匹配a或b。构造(。)有什么作用?
迈克尔·布莱克本

对于有相同问题的任何人,它都定义了替换“ blob”,用于替换部分。Blob顺序编号,第一个()放入$ 1,第二个放入$ 2。我发现此网站很有用:javascript.info/tutorial/regular-expressions-methods
Michael Blackburn

我无法使以上内容正常工作,但离正则表达式向导还很远。我使用的是 'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}) Again,这仅适用于大写字符串的第一个字母,但是如果您需要的话,我的构造将起作用。
迈克尔·布莱克本

1
由于某些原因,FF35似乎阻塞'$1'.toUpperCase(),似乎在分配值时还没有完成大写。通过使用功能来解决'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
MrYellow 2015年

大家好,答案是固定的!我很确定在我最初发布它时它就可以正常工作。无论如何,感谢您的输入!
simo

17

您可以立即toLowerCase输入字符串,然后toUpperCase输入每个单词的第一个字母。成为一个非常简单的1班轮:

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));


我喜欢这个解决方案;很好很简单。尽管(s => s.toUpperCase())看起来有点CoffeeScript误入了您的答案。我的变体是执行您所做的事情,但是扩展String对象(就那样有争议):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
Waz

1
@Waz,感谢您的想法!只是想在上进行说明=>,这是一个本机箭头功能(ES6),该链接跳至它们上的Mozillla文档,该文档还提供了一个支持表。
KevBot

16

以防万一您担心这些填充词,您始终可以告诉函数不要大写的内容。

/**
 * @param String str The text to be converted to titleCase.
 * @param Array glue the words to leave in lowercase. 
 */
var titleCase = function(str, glue){
    glue = (glue) ? glue : ['of', 'for', 'and'];
    return str.replace(/(\w)(\w*)/g, function(_, i, r){
        var j = i.toUpperCase() + (r != null ? r : "");
        return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
    });
};

希望这可以帮助你。

编辑

如果要处理前导粘合词,则可以跟踪此w /一个变量:

var titleCase = function(str, glue){
    glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
    var first = true;
    return str.replace(/(\w)(\w*)/g, function(_, i, r) {
        var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
        var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
        first = false;
        return result;
    });
};

2
您可以将字符串分解为数组。因此,我们可以使用葡萄牙文,西班牙文,意大利文和法文的介词:glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
JuniorMayhé2012年

这不能确保首字母大写;即and another thing成为and Another Thing。只需要一种优雅的方法来始终将第一个单词大写即可。
Brad Koch

@BradKoch-用空格填充,以便您将'和','de'等用作搜索词,然后将'And Another And Another'替换为'And Another and Another'。
Yimin Rong

但它也不错大写文字后“和-像H'Dy或头号
luky

除了使用三元运算符,您还可以使用备用:胶水=胶水||。['of','for','and','a'];
tm2josep

14

如果上述解决方案中使用的正则表达式让您感到困惑,请尝试以下代码:

function titleCase(str) {
  return str.split(' ').map(function(val){ 
    return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
  }).join(' ');
}

爱它!没有转换为数组。
neelmeg

1
呃... split 确实将其转换为数组,您只是没有明显地看到它,因为这map意味着您不必使用[]表示法
MalcolmOcean


1
单字符输入中断。
Madbreaks

1
@AlexChaffee检查修订历史记录。a8m在原始答案中未使用箭头功能。
谢谢您,

9

我制作了可以处理姓氏(因此不是标题大小写)的函数,例如“ McDonald”或“ MacDonald”或“ O'Toole”或“ D'Orazio”。但是,它不能处理带有小写的“ van”或“ von”的德语或荷兰语名称,我相信“ de”也经常是小写的,例如“ Robert de Niro”。这些仍然必须解决。

function toProperCase(s)
{
  return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
          function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); });
}

1
+1可提高名称意识。但是,也不能正确处理“ macy”。
brianary 2013年

这是唯一能够正确处理将大写和小写字母转换为正确大小写的功能,并且注意到诸如“美属维尔京群岛”的首字母缩写。
罗德里戈·波罗

您可以通过在其中macy放置负前瞻来解决问题,以便\b((m)(a?c))?(\w)变得\b((m)(a?c))?(\w)(?!\s)
Ste19年

8
var toMatch = "john w. smith";
var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
      return i.toUpperCase() + (r != null ? r : "");
    }
)

似乎可以工作...经过上面的测试,“快速变褐的狐狸? file1.txt”。

如果您想要2Nd而不是2nd,则可以更改为/([a-z])(\w*)/g

第一种形式可以简化为:

function toTitleCase(toTransform) {
  return toTransform.replace(/\b([a-z])/g, function (_, initial) {
      return initial.toUpperCase();
  });
}

7

尝试这个

String.prototype.toProperCase = function(){
    return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, 
        function($1){
            return $1.toUpperCase();
        }
    );
};

var str = 'john smith';
str.toProperCase();

7

尝试这种最简单的方法:

str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());

7

ES 6

str.split(' ')
   .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
   .join(' ')

其他

str.split(' ').map(function (s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
}).join(' ')

刚抬起头,也许应该是s.slice(0, 1).toUpperCase(),如果你仍然想的是第一个字母。
WindsofTime 2016年

@jssridhar,您还应该更正ES6中的代码。
caiosm1005 '16

1
如果str是单个字符则中断
Madbreaks '18

@jssridhar对我们可能更好.charAt(0).toUpperCase()
roydukkey

2
a8m答案的副本
谢谢您,

6

这些答案大多数似乎都忽略了使用单词边界元字符(\ b)的可能性。Greg Dean使用它的答案的简短版本:

function toTitleCase(str)
{
    return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
}

也适用于连字符的名字,例如Jim-Bob。


2
是一种优雅的局部解决方案,但不适用于重音或大写字母字符串。我得到“SofíaVergara” =>“SofíAVergara”或“SofíaVERGARA” =>“SofíAVERGARA”。第二种情况可以通过在.replace(...)之前应用apply .toLowerCase()函数来解决。第一种情况需要找到正确的正则表达式。
Asereware 2014年

2
嗯,这似乎是正则表达式实现中的一个错误,我认为带重音的字符应该是文字字符(不过您是正确的,因为它在那些情况下不起作用)。
lewax00 2014年

\w仅包含字符[A-Za-z0-9_],而不是所有字母。为此,您需要使用Unicode类别\p{L}。您将需要/u修饰符(请参见此处)和的其他解决方案\b,该解决方案仅在\W和之间起作用\w(请参见此处
cmbuckley

6

如果您可以在代码中使用第三方库,那么lodash将为我们提供帮助功能。

https://lodash.com/docs/4.17.3#startCase

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'
 
_.startCase('fooBar');
// => 'Foo Bar'
 
_.startCase('__FOO_BAR__');
// => 'FOO BAR'


6

我认为最简单的方法是使用CSS。

function format_str(str) {
    str = str.toLowerCase();
    return '<span style="text-transform: capitalize">'+ str +'</span>';
}

我更新了代码并对其进行了测试。现在应该可以工作了。
windim的

您只能在使用JS的部分环境中使用CSS,因此该解决方案不可行。同样,应该不惜一切代价避免使用内联样式。
Madbreaks

5

使用/\S+/g以支持变音符号:

function toTitleCase(str) {
  return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
}

console.log(toTitleCase("a city named örebro")); // A City Named Örebro

但是:“ s发光(y黄色)”⇒“ s发光(y黄色)”


5

我想添加自己的答案,因为我需要一个toTitleCase功能强大的功能,该功能考虑了此处列出的语法规则(Google推荐的文章)。有多种规则取决于输入字符串的长度。下面是功能+单元测试。

该函数还合并空格并删除特殊字符(根据需要修改正则表达式)

toTitleCase函数

const toTitleCase = (str) => {
  const articles = ['a', 'an', 'the'];
  const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
  const prepositions = [
    'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
    'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
  ];

  // The list of spacial characters can be tweaked here
  const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
  const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
  const normalizeStr = (str) => str.toLowerCase().trim();
  const shouldCapitalize = (word, fullWordList, posWithinStr) => {
    if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
      return true;
    }

    return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
  }

  str = replaceCharsWithSpace(str);
  str = normalizeStr(str);

  let words = str.split(' ');
  if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
    words = words.map(w => capitalizeFirstLetter(w));
  }
  else {
    for (let i = 0; i < words.length; i++) {
      words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
    }
  }

  return words.join(' ');
}

单元测试以确保正确性

import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';

describe('toTitleCase', () => {
  it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
    expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
    expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
    expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
  });

  it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
    expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
    expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
    expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
  });

  it('Replace special characters with space', function(){
    expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
    expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
  });

  it('Trim whitespace at beginning and end', function(){
    expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
  });

  it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
    expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
    expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
  });
});

请注意,我从提供的字符串中删除了很多特殊字符。您将需要调整正则表达式以解决项目的需求。


我更喜欢这种解决方案,因为它确实解决了标题问题。它不是“
随风而逝

5
"john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())

1
适用于示例o'henry,但对于确实有点奇怪horse's mouth
Michael-Clay Shirky在哪里,

"john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())更好
w3debugger

不想编辑@Proximo的答案:\b\S是特殊字符类,分别表示“单词边界”和“单个非空白字符”。因此,正则表达式匹配单词边界后的每个单个字符,并通过应用给定的箭头功能将其大写。
詹斯

4

使用“ lewax00”解决方案,我创建了这个简单的解决方案,该解决方案强制以“ w”开头的空格或“ w”开头的单词,但无法删除多余的中间空格。

"SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });

结果是“SofíaVergara”。


4

这是我的功能,用于处理带重音的字符(对于法语来说很重要!),并且可以打开/关闭降低异常的处理。希望能有所帮助。

String.prototype.titlecase = function(lang, withLowers = false) {
    var i, string, lowers, uppers;

    string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }).replace(/Mc(.)/g, function(match, next) {
        return 'Mc' + next.toUpperCase();
    });

    if (withLowers) {
        if (lang == 'EN') {
            lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
        }
        else {
            lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
        }
        for (i = 0; i < lowers.length; i++) {
            string = string.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) {
                return txt.toLowerCase();
            });
        }
    }

    uppers = ['Id', 'R&d'];
    for (i = 0; i < uppers.length; i++) {
        string = string.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase());
    }

    return string;
}

4

我们已经在办公室这里进行了讨论,我们认为尝试以您想要的当前方式自动更正人们输入姓名的方式充满了可能的问题。

我们提出了几种情况,其中不同类型的自动大写字母分开了,这些仅用于英文名称,每种语言都有其自身的复杂性。

每个名字的首字母大写的问题:

•不允许输入缩写词,例如IBM,将变成ibm。

•麦当劳的名字会变成麦当劳,这是不正确的,麦克唐纳也是一样。

•像玛丽·唐克斯(Marie-Tonks)这样的双重桶装名字将变成玛丽·唐克斯。

•O'Connor之类的名字将变成O'connor。

对于大多数这些,您可以编写自定义规则来处理它,但是,与以前一样,首字母缩略词仍然存在问题,并且您会遇到一个新问题:

•添加规则以使用Mac(例如MacDonald)来修复名称,将诸如Macy这样的中断名称转换为MacY。

我们提出的唯一永远不会出错的解决方案是将每个字母都大写,这是DBS似乎也使用的蛮力方法。

因此,如果您想使流程自动化,那么没有每个名称和单词的字典以及如何对其进行首字母大写是不可能的,如果您没有涵盖所有内容的规则,请不要使用它只会惹恼您的用户,并提示想要正确输入姓名的人转到其他地方。


4

这是使用CSS(和javascript,如果要转换的文本为大写)的另一种解决方案:

html

<span id='text'>JOHN SMITH</span>

js

var str = document.getElementById('text').innerHtml;
var return_text = str.toLowerCase();

的CSS

#text{text-transform:capitalize;}

3

对于那些害怕正则表达式的人:

function titleCase(str)
{
    var words = str.split(" ");
    for ( var i = 0; i < words.length; i++ )
    {
        var j = words[i].charAt(0).toUpperCase();
        words[i] = j + words[i].substr(1);
    }
    return words.join(" ");
}


3

我的一线解决方案:

String.prototype.capitalizeWords = function() {
    return this.split(" ").map(function(ele){ return ele[0].toUpperCase() + ele.slice(1).toLowerCase();}).join(" ");
};

然后,您可以capitalizeWords()在任何字符串上调用该方法。例如:

var myS = "this actually works!";
myS.capitalizeWords();

>>> This Actually Works

我的其他解决方案:

function capitalizeFirstLetter(word) {
    return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeAllWords = function() {
    var arr = this.split(" ");
    for(var i = 0; i < arr.length; i++) {
        arr[i] = capitalizeFirstLetter(arr[i]);
    }
    return arr.join(" ");
};

然后,您可以capitalizeWords()在任何字符串上调用该方法。例如:

var myStr = "this one works too!";
myStr.capitalizeWords();

>>> This One Works Too

基于Greg Dean的替代解决方案:

function capitalizeFirstLetter(word) {
    return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeWords = function() {
    return this.replace(/\w\S*/g, capitalizeFirstLetter);
};

然后,您可以capitalizeWords()在任何字符串上调用该方法。例如:

var myString = "yes and no";
myString.capitalizeWords()

>>> Yes And No

3

惊讶地发现没有人提到rest参数的使用。这是一个使用ES6 Rest参数的简单衬垫。

let str="john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.log(str)


2

这基于我对FreeCodeCamp的Bonfire“标题案例”的解决方案要求您首先将给定的字符串转换为所有小写字母,然后将每个字符转换为大写字母。

不使用正则表达式:

function titleCase(str) {
 return str.toLowerCase().split(' ').map(function(val) { return val.replace(val[0], val[0].toUpperCase()); }).join(' ');
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.