regex 如何使用JavaScript将每个句子中的第一个单词大写?

7kqas0il  于 2022-11-18  发布在  Java
关注(0)|答案(3)|浏览(117)

这个网站和互联网上充斥着“如何大写每个单词”的答案,但这不是我想做的。我在任何地方都找不到这个问题的答案。尽管它看起来确实像是应该得到很好回答的东西。
以前面的三个句子为例,假设我把它们写成:

这个网站和互联网上到处都是“如何大写每个单词”的答案,但这不是我想做的。而且我在任何地方都找不到这个问题的答案。尽管它看起来确实像是应该得到很好回答的东西。

我想一个JS函数,将大写的三个粗体字。考虑到句子可以结束后:“.”"?“或”!“。
我正在使用Vue这个项目,所以使用Vue的东西会很好,但香草JS也会很好。

6tdlim6h

6tdlim6h1#

由于可能有多个分隔符需要保留,所以split不是一个选项。另一个简单的方法是使用全局替换来处理每个句子,其中一个句子以标点符号结尾,后面跟着一个空格,标点符号在字符串的结尾是可选的:

sentences.replace(
  /.+?([.?!]+(\s+|$)|$)/g,
  sentence => sentence ? sentence[0].toUpperCase() + sentence.slice(1) : ''
)
pbpqsu0x

pbpqsu0x2#

最简单但也是最可靠的方法是将replace与类似/(?:^|[.!?]\s+)\w/gregular expression及其toUpperCase艾德匹配一起使用。
提供的模式... / (?:^|[.!?]\s+)\w /g ...如下所示...

  • (?:^|[.!?]\s+) ...以非捕获方式匹配组( ... )(?: ... )
  • ^|[.!?]\s+ ...有两个匹配的备选项... |(或)...
  • 新行的开头... ^
  • 或者是一个字符,它可以是字符类... [.!?] ...,后跟至少一个空格... \s+ ...字符(其中,\s的等效字符是[\r\n\t\f\v \u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff])。
  • \w ...与单个单词字符完全匹配(其中,\w的对等项为[a-zA-Z0-9_])。
  • 由于g全局修饰符标志,匹配所有内容。

第一个

p1tboqfb

p1tboqfb3#

您可以尝试使用regex模式/([!.]\s+)([a-z])/g
匹配将被传递以替换回调函数,以仅传递到第二捕获组([a-z])的上部。

const string = "this site and the internet are filled with answers to 'how to capitalize every word' but that isn't what I want to do. and I couldn't find any answers anywhere to this question. though it does seem like something that should have been answered well.";

const result = string.replace(/([!.]\s+)([a-z])/g, (_, segmentOne, segmentTwo) => segmentOne + segmentTwo.toUpperCase());
console.log(result[0].toUpperCase() + result.slice(1));

图案:
([!.]\s+)-正在捕获!.
([a-z])-捕获小写字母。

相关问题