【问题标题】:How to capitalize all the words in a sentence except some words?如何将句子中除某些单词之外的所有单词大写?
【发布时间】:2021-05-06 08:45:28
【问题描述】:

我需要将句子中的所有单词大写,除了一些单词。

例如:

ABOUT UNICORN TECHNOLOGIES

输出:

About unicorn technologies

这里的 Unicorn, Technologies 可能是大写或大写或小写,但如果这些值出现在任何句子中,我需要将其转换为小写。

例句是,

ANDRII IS GOOD IN JS TECHNOLOGIES

THIS HORSE LOOKS LIKE A UNICORN

输出:

Andrii Is Good In Js technologies

This Horse Looks Like A unicorn

我尝试使用 lodash 来实现这一点。但我不能这样做:(

帮我做这件事。提前致谢

【问题讨论】:

  • 我们如何决定哪些应该大写
  • "我尝试使用 lodash 来实现这一点。" - 你到底尝试了什么? “但它不起作用”——“不起作用”是什么意思?
  • expect technologies & unicorn 所有其他词都需要大写,而这两个必须小写
  • 我已经编辑了我的问题
  • @DhanushKumarS 其他词需要大写吗?还是其他话不变?在您的问题中,其他词语也发生了变化。

标签: javascript reactjs lodash


【解决方案1】:

使用 String#split Array#mapArray#join

如果单词出现在Set 中,则用空格分割句子,如果单词出现在每个单词上,只需将其小写,如果没有,则将其更改为titlecase。

const 
  strs = new Set(["ABOUT", "UNICORN", "TECHNOLOGIES"]),
  sentence = "ANDRII IS GOOD IN JS TECHNOLOGIES",
  res = sentence
    .split(" ")
    .map((w) =>
      strs.has(w.toUpperCase())
        ? w.toLowerCase()
        : w[0].toUpperCase() + w.slice(1).split().map((c) => c.toLowerCase())
    )
    .join(" ");

console.log(res);

【讨论】:

  • @DhanushKumarS 请检查这是否解决了您的问题,如果您有任何问题,请告诉我。
【解决方案2】:

您基本上首先将所有内容都小写,然后检查每个单词是否是特殊关键字之一。如果是则返回,如果不是则大写第一个字母并返回。

下面是一个例子。我也做了它,所以它保持换行符,因为你的例子似乎是一个多行输入。

const keywords = new Set( ['technologies','unicorn']);

const lines = `ANDRII IS GOOD IN JS TECHNOLOGIES

THIS HORSE LOOKS LIKE A UNICORN`.split("\n");

function normalizeCase(t) {
  const words = t.toLowerCase().split(' ');
  return words.map(w => 
    keywords.has(w) 
     ? w
     : w[0] 
        ? w[0].toUpperCase() + w.slice(1)
        : ''        
    ).join(' ');
}

const newLines =
  lines.map(l => normalizeCase(l));
  
console.log(newLines.join("\n"));

【讨论】:

    【解决方案3】:

    您可以替换所有没有空格的字符并用对象检查特殊单词。

    const nice = s => s.replace(/\S+/g, s => ({ UNICORN : 'unicorn', TECHNOLOGIES: 'technologies' }[s] || s[0].toUpperCase() + s.slice(1).toLowerCase()));
    
    console.log(nice('ABOUT UNICORN TECHNOLOGIES'));

    【讨论】:

      【解决方案4】:

      var a = "ANDRII IS GOOD IN JS TECHNOLOGIES TECHNOLOGIESX";
      a = a.replace(/\b(technologies\b|unicorn\b)?(?:([^\s])([^\s]*)\b)?/gi, (_,b,c,d) => {
         b = b ?  b.toLowerCase() : "";
         c = c ?  c.toUpperCase() : "";
         d = d ?  d.toLowerCase() : "";
         return b + c + d;
      });
      console.log(a);

      正则表达式解释:

      • \b:字边界
      • (technologies\b|unicorn\b)?:如果单词是技术或独角兽(不区分大小写),则捕获该单词的第一个捕获组。 \b 用于区分 TECHNOLOGIES 和 TECHNOLOGIESX。
      • (?:([^\s])([^\s]*)\b)?:非捕获组。
        • ([^\s]):如果单词不是技术或独角兽(不区分大小写),则第二个捕获组捕获单词的第一个字母。
        • ([^\s]*):如果单词不是技术或独角兽(不区分大小写),则第三个捕获组捕获其余单词。

      【讨论】:

        【解决方案5】:

        我的解决方案是创建一个您想要小写的单词列表,并在遍历字符串时使用它,如果当前单词在列表中,则为小写,否则为小写。

        工作示例

        const capitalizeExc = (string, exceptions) => {
          const words = string.split(' ')
          exceptions = exceptions.toLowerCase()
          const result = words.map((word) => {
            if (exceptions.includes(word.toLowerCase())) {
              return word.toLowerCase()
            } else {
              return word.charAt(0).toUpperCase() +  word.slice(1).toLowerCase()
            }
          }).join(' ')
          return result
        }
        
        console.log(capitalizeExc('ANDRII IS GOOD IN JS TECHNOLOGIES', 'technologies unicorn'))

        更多信息

        Array.map()Array.join()String.split()String.includes()

        当然,你应该尽量优化它的性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-04
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 2021-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多