【问题标题】:Uppercase first letter of each word and handling latin characters [duplicate]每个单词的大写首字母和处理拉丁字符[重复]
【发布时间】:2019-10-11 15:26:34
【问题描述】:

我正在尝试将句子中每个单词的首字母大写。

在 javascript 中,\b 似乎是为此而设计的:它匹配单词的开头。

这适用于 ascii 字符:

static capitalize(str: string): string {
  return str.replace(new RegExp('\\b\\w', 'g'), (txt) => txt.toUpperCase());
}

此测试通过:

expect(StringUtils.capitalize('jean-michel dupont')).toEqual('Jean-Michel Dupont');

问题:当我使用拉丁字符时,拉丁字符和下一个字符都是大写的。

StringUtils.capitalize('Fais de ta vie un rêve, et d\'un rêve, une réalité.')

Fais De Ta Vie Un RÊVe, Et D'un RÊVe, Une RÉAlité. // Actual

Fais De Ta Vie Un Rêve, Et D'Un Rêve, Une Réalité. // Expected

有没有办法解决这个问题?

【问题讨论】:

标签: javascript regex typescript


【解决方案1】:

你能用 CSS 代替 JavaScript 吗?如果是这样,请查看text-transform CSS 属性。

例子:

<div style="text-transform: capitalize">Fais de ta vie un rêve, et d'un rêve, une réalité.</div>

【讨论】:

  • 同上,你错过了u -> d'un rêve中的U应该变成D'Un Rêve
  • 我实际上并不知道拉丁文撇号后的大写规则。但是,在英语中,我不希望撇号后面的以下内容大写:Don'tFriend's。可能有一套明确的规则,您可以将自己实现为正则表达式,但您需要自己权衡成本/努力。
  • 我不想自己做,这不是我的问题,而是OP要求
  • 仅供参考,这不是拉丁语,而是法语。
  • 你是拼写O'Connor还是O'connor
【解决方案2】:

尝试使用(?:^|\\s) 而不是\b(来自https://stackoverflow.com/a/10590516/11541562

function capitalize(str) {
  return str.replace(new RegExp("(?:^|\\s)\\w", "g"), txt => txt.toUpperCase());
}

console.log(capitalize("Fais de ta vie un rêve, et d'un rêve, une réalité."));

【讨论】:

  • 你错过了u -> U in d'un rêve 应该变成D'Un Rêve
  • 没关系!我稍微修改了它以将' 考虑在内,它可以工作! (new RegExp('(?:^|\\s|\')\\w', 'g'))
  • \b 超过 (?:^|\s) (如链接答案中所述)。
  • @ArnaudDenoyelle:.,?,仅举几例?这些都是单词边界。
  • @Jan True。到目前为止,我最好的选择是列出“合理”的界限。类似new RegExp('(?:^|\\s|[!,:;\\-\'\.\?"])\\w', 'g')
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2020-08-30
  • 2016-12-05
  • 2015-11-10
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多