【问题标题】:Convert camelCaseText to Title Case Text将 camelCaseText 转换为句子大小写文本
【发布时间】:2011-11-05 17:26:24
【问题描述】:

如何在 JavaScript 中将 'helloThere' 或 'HelloThere' 之类的字符串转换为 'Hello There'?

【问题讨论】:

  • hmm.. 您对 iLiveInTheUSA 的预期输出是什么?
  • 我住在美国...哦,废话! - 但就我而言,我有一组有限的字符串,并且没有这样的字符串可以破坏一个简单的转换器。不过很好!
  • 同样的 uSBPort 应该会产生“USB Port”
  • @wim:iLiveInTheUSA 应该是 iLiveInTheUsa 的正确驼峰式表示法,但这会带来不同的问题。
  • HelloThere -> 你好没有作为标题格的句子格

标签: javascript regex string


【解决方案1】:

const text = 'helloThereMister';
const result = text.replace(/([A-Z])/g, " $1");
const finalResult = result.charAt(0).toUpperCase() + result.slice(1);
console.log(finalResult);

首字母大写 - 例如。注意" $1"中的空格。


当然,如果第一个字母已经是大写字母 - 您将有多余的空间可以删除。

【讨论】:

  • 我在text.replace 中挖掘了空格的使用,为了便于阅读,我一直在用空格填充函数调用 2+ 参数
  • uSBPorts=>U S B 端口,不是我所期望的,我想要一个 USB 端口
  • 像Non-GoogleChrome这样写怎么样?
  • @signonsridhar 伙计,如果有人将小写的usb ports 写成uSBPorts,我会从他们的键盘上偷走shift 键。我希望它是usbPorts。在theUSA 等情况下,您可以选择consecutiveCapsMode 等不同模式:例如lower 和split。然后做camelToSentence('theUSA', { consecutiveCapsMode: 'lower' })应该返回theUsa等
  • 再往上看,就像:camelToKebab = (str, mode) { let rgx = /defaultRgx/; switch(mode) { 'lower': rgx = /lowerRgx/; break; } ... }
【解决方案2】:

我遇到了类似的问题,是这样处理的:

stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")

对于更强大的解决方案:

stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")

http://jsfiddle.net/PeYYQ/

输入:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA

输出:

 hello There 
 Hello There 
 I Love The USA
 i Love The USA

【讨论】:

  • 它在开始时增加了一个空格
  • 这不是 OP 要求的句子大小写。第一个字母应大写。
  • 另外,它在单词之间增加了一个额外的空格
【解决方案3】:

你可以使用这样的函数:

function fixStr(str) {
    var out = str.replace(/^\s*/, "");  // strip leading spaces
    out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
        if (offset == 0) {
            return(str.toUpperCase());
        } else {
            return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
        }
    });
    return(out);
}

"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"

这里有一堆测试字符串的代码:http://jsfiddle.net/jfriend00/FWLuV/。

在此处保留前导空格的替代版本:http://jsfiddle.net/jfriend00/Uy2ac/。

【讨论】:

  • 我知道这不是问题中的要求,但例如,您的解决方案不适用于 " helloWorld"。
  • 是的,这是一个新要求。我试图完全按照您最初的要求去做。无论如何,如果您无论如何都不需要它们,那么捷径很容易将前导空格隔开。如果您希望它们留在原地,也可以这样做。
  • 这是一个 jsFiddle,它显示了一种适用于“helloWorld”的新要求并保留前导空格(如果需要)的方法:jsfiddle.net/jfriend00/Uy2ac。
  • 不错。不过,我想知道它的性能。每次比赛都会调用处理函数,不是吗?
  • 如果您在对性能敏感的设置中执行大量此类操作,则需要在一堆浏览器中进行一些 jsperf 测试才能看到最快的解决方案是什么。调用回调没什么大不了的。任何类型的正则表达式都很少是与专用代码相比最快的解决方案,但它们可以节省大量代码(通常还有一些错误),因此通常是理想的选择。这取决于您的要求。
【解决方案4】:

试试这个库

http://sugarjs.com/api/String/titleize

'man from the boondocks'.titleize()>"Man from the Boondocks"
'x-men: the last stand'.titleize()>"X Men: The Last Stand"
'TheManWithoutAPast'.titleize()>"The Man Without a Past"
'raiders_of_the_lost_ark'.titleize()>"Raiders of the Lost Ark"

【讨论】:

    【解决方案5】:

    这是我的版本。它会在小写英文字母之后的每个大写英文字母之前添加一个空格,并在需要时将第一个字母大写:

    例如:
    thisIsCamelCase --> 这是骆驼案
    this IsCamelCase --> This Is Camel Case
    thisIsCamelCase123 --> 这是 Camel Case123

      function camelCaseToTitleCase(camelCase){
        if (camelCase == null || camelCase == "") {
          return camelCase;
        }
    
        camelCase = camelCase.trim();
        var newText = "";
        for (var i = 0; i < camelCase.length; i++) {
          if (/[A-Z]/.test(camelCase[i])
              && i != 0
              && /[a-z]/.test(camelCase[i-1])) {
            newText += " ";
          }
          if (i == 0 && /[a-z]/.test(camelCase[i]))
          {
            newText += camelCase[i].toUpperCase();
          } else {
            newText += camelCase[i];
          }
        }
    
        return newText;
      }
    

    【讨论】:

      【解决方案6】:

      好的,我迟到了几年,但我有一个类似的问题,我想为每个可能的输入制定一个可替换的解决方案。我必须将大部分功劳归功于此线程中的@ZenMaster 和this 线程中的@Benjamin Udink 十个凯特。 代码如下:

      var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
      var textArray = ["lowercase",
                       "Class",
                       "MyClass",
                       "HTML",
                       "PDFLoader",
                       "AString",
                       "SimpleXMLParser",
                       "GL11Version",
                       "99Bottles",
                       "May5",
                       "BFG9000"];
      var text;
      var resultArray = [];
      for (var i = 0; i < textArray.length; i++){
          text = textArray[i];
          text = text.replace(camelEdges,'$1 ');
          text = text.charAt(0).toUpperCase() + text.slice(1);
          resultArray.push(text);
      }
      

      它有三个子句,都使用lookahead来防止正则表达式引擎消耗过多的字符:

      1. [A-Z](?=[A-Z][a-z]) 查找一个大写字母,后跟一个大写字母,然后是一个小写字母。这是为了结束像 USA 这样的首字母缩略词。
      2. [^A-Z](?=[A-Z]) 查找后跟大写字母的非大写字母。这将结束诸如 myWord 之类的单词和 99Bottles 之类的符号。
      3. [a-zA-Z](?=[^a-zA-Z]) 查找一个字母后跟一个非字母。这会在 BFG9000 等符号之前结束单词。

      这个问题在我的搜索结果顶部,所以希望我可以节省其他人一些时间!

      【讨论】:

        【解决方案7】:

        以上答案都不适合我,所以必须自备自行车:

        function camelCaseToTitle(camelCase) {
            if (!camelCase) {
                return '';
            }
        
            var pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.substr(1);
            return pascalCase
                .replace(/([a-z])([A-Z])/g, '$1 $2')
                .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
                .replace(/([a-z])([0-9])/gi, '$1 $2')
                .replace(/([0-9])([a-z])/gi, '$1 $2');
        }
        

        测试用例:

        null => ''
        '' => ''
        'simpleString' => 'Simple String'
        'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
        'stringWithNumber123' => 'String With Number 123'
        'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'
        

        【讨论】:

          【解决方案8】:

          我发现的用于测试 camel-case-to-title-case 函数的最佳字符串是这个荒谬荒谬的示例,它测试了很多边缘情况。 据我所知,之前发布的函数均未正确处理此问题:

          __ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPpersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

          这应该转换为:

          要及时获得 GED 一首关于 26 个 ABC 的歌曲是精髓,但在 26A 室包含 26 次 ABC 的用户 456 的个人身份证并不像 C3PO 或 R2D2 或 2R2D 的 123 那样简单

          如果您只想要一个简单的函数来处理上述案例(并且比之前的许多答案更多案例),这是我写的。这段代码不是特别优雅或快速,但它简单、易懂且有效。

          下面的sn-p包含一个在线可运行的例子:

          var mystrings = [ "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D", "helloThere", "HelloThere", "ILoveTheUSA", "iLoveTheUSA", "DBHostCountry", "SetSlot123ToInput456", "ILoveTheUSANetworkInTheUSA", "Limit_IOC_Duration", "_This_is_a_Test_of_Network123_in_12__days_",  "ASongAboutTheABCsIsFunToSing", "CFDs", "DBSettings", "IWouldLove1Apple", "Employee22IsCool", "SubIDIn",  "ConfigureABCsImmediately", "UseMainNameOnBehalfOfSubNameInOrders" ];
          
          // Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
          // 
          // E.g.:
          //    __ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
          //                                            --> To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D
          //    helloThere                              --> Hello There
          //    HelloThere                              --> Hello There 
          //    ILoveTheUSA                             --> I Love The USA
          //    iLoveTheUSA                             --> I Love The USA
          //    DBHostCountry                           --> DB Host Country
          //    SetSlot123ToInput456                    --> Set Slot 123 To Input 456
          //    ILoveTheUSANetworkInTheUSA              --> I Love The USA Network In The USA
          //    Limit_IOC_Duration                      --> Limit IOC Duration
          //    This_is_a_Test_of_Network123_in_12_days --> This Is A Test Of Network 123 In 12 Days
          //    ASongAboutTheABCsIsFunToSing            --> A Song About The ABCs Is Fun To Sing
          //    CFDs                                    --> CFDs
          //    DBSettings                              --> DB Settings
          //    IWouldLove1Apple                        --> I Would Love 1 Apple
          //    Employee22IsCool                        --> Employee 22 Is Cool
          //    SubIDIn                                 --> Sub ID In
          //    ConfigureCFDsImmediately                --> Configure CFDs Immediately
          //    UseTakerLoginForOnBehalfOfSubIDInOrders --> Use Taker Login For On Behalf Of Sub ID In Orders
          //
          function camelCaseToTitleCase(in_camelCaseString) {
                  var result = in_camelCaseString                         // "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
                      .replace(/(_)+/g, ' ')                              // " ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser 456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
                      .replace(/([a-z])([A-Z][a-z])/g, "$1 $2")           // " To Get YourGEDIn TimeASong About The26ABCs IsOf The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times IsNot AsEasy As123ForC3POOrR2D2Or2R2D"
                      .replace(/([A-Z][a-z])([A-Z])/g, "$1 $2")           // " To Get YourGEDIn TimeASong About The26ABCs Is Of The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
                      .replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2")          // " To Get Your GEDIn Time ASong About The26ABCs Is Of The Essence But APersonal IDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
                      .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2")     // " To Get Your GEDIn Time A Song About The26ABCs Is Of The Essence But A Personal ID Card For User456In Room26A ContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
                      .replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2")           // " To Get Your GEDIn Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3POOr R2D2Or 2R2D"
                      
                      // Note: the next regex includes a special case to exclude plurals of acronyms, e.g. "ABCs"
                      .replace(/([A-Z]+)([A-Z][a-rt-z][a-z]*)/g, "$1 $2") // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
                      .replace(/([0-9])([A-Z][a-z]+)/g, "$1 $2")          // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC 26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"  
          
                      // Note: the next two regexes use {2,} instead of + to add space on phrases like Room26A and 26ABCs but not on phrases like R2D2 and C3PO"
                      .replace(/([A-Z]{2,})([0-9]{2,})/g, "$1 $2")        // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
                      .replace(/([0-9]{2,})([A-Z]{2,})/g, "$1 $2")        // " To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
                      .trim()                                             // "To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
                     ;
          
            // capitalize the first letter
            return result.charAt(0).toUpperCase() + result.slice(1);
          }
          
          for (var i = 0; i < mystrings.length; i++) {
            jQuery(document.body).append("<br />\"");
            jQuery(document.body).append(camelCaseToTitleCase(mystrings[i]));
            jQuery(document.body).append("\"<br>(was: \"");
            jQuery(document.body).append(mystrings[i]);
            jQuery(document.body).append("\") <br />");
          }
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"&gt;&lt;/script&gt;

          【讨论】:

          • 下划线间隔的测试用例不再起作用,只是提醒一下。添加:.replace(/_/g,' ') 解决了这个问题。另外,添加.replace(\&amp;\, ' &amp; ') 支持与符拆分
          • 感谢@JustinDalrymple 指出这一点。我们的内部代码将上面的camelCaseToTitleCase() 函数包装在一个处理下划线的助手中,所以我在发布时没有注意到遗漏。我现在修复上面的代码。
          • 这是迄今为止我找到的最完整的解决方案。谢谢!
          【解决方案9】:

          这对我有用,看看这个

          CamelcaseToWord("我的名字"); // 返回我的名字

              function CamelcaseToWord(string){
                return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
              }
          

          【讨论】:

          • 欢迎来到 SO :) 请在您的代码中添加至少一个解释行。还要确保这是您的智力作品或引用来源。
          • 您应该删除 lat "$1" 中的空格。 string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, "$1");
          【解决方案10】:

          或者使用lodash:

          lodash.startCase(str);
          

          例子:

          _.startCase('helloThere');
          // ➜ 'Hello There'
          

          Lodash 是一个很好的库,可以为许多日常 js 任务提供快捷方式。还有许多其他类似的字符串操作函数,例如 camelCase、kebabCase 等。

          【讨论】:

          • 如果你要尝试hello world,那么输出应该是Hello There,在这种情况下loadash将没有帮助。
          • @AbhishekKumar startCase of lodash 实际上会将hello world 转换为Hello World lodash.com/docs/4.17.15#upperFirst
          • 你说得对,兄弟。我错误地将hello there 写成了hello world。
          • 每当我想“lodash 不可能也这样做”时,它确实如此。
          • 从 v4 开始要小心,此函数删除像 ä 这样的特殊字符并将它们转换为 ASCII 字符(在这种情况下为 a)
          【解决方案11】:

          没有副作用的例子。

          function camel2title(camelCase) {
            // no side-effects
            return camelCase
              // inject space before the upper case letters
              .replace(/([A-Z])/g, function(match) {
                 return " " + match;
              })
              // replace first char with upper case
              .replace(/^./, function(match) {
                return match.toUpperCase();
              });
          }
          

          在 ES6 中

          const camel2title = (camelCase) => camelCase
            .replace(/([A-Z])/g, (match) => ` ${match}`)
            .replace(/^./, (match) => match.toUpperCase())
            .trim();
          

          【讨论】:

          • 固体,es6 sn-p +1。
          • 仅供参考,这会在句子的开头添加额外的空格。
          • @DaleZak,迟到的谢谢!我一直想去,但显然社区机器人已经为我修好了……?
          【解决方案12】:

          我没有尝试每个人的答案,但我修补的少数解决方案并不符合我的所有要求。

          我能够想出一些可以做到的事情......

          export const jsObjToCSSString = (o={}) =>
              Object.keys(o)
                    .map(key => ({ key, value: o[key] }))
                    .map(({key, value}) =>
                        ({
                          key: key.replace( /([A-Z])/g, "-$1").toLowerCase(),
                          value
                        })
                    )
                    .reduce(
                        (css, {key, value}) => 
                            `${css} ${key}: ${value}; `.trim(), 
                        '')
          

          【讨论】:

            【解决方案13】:

            在对上面的一些想法不满意之后,添加另一个我更喜欢的 ES6 解决方案。

            https://codepen.io/902Labs/pen/mxdxRv?editors=0010#0

            const camelize = (str) => str
                .split(' ')
                .map(([first, ...theRest]) => (
                    `${first.toUpperCase()}${theRest.join('').toLowerCase()}`)
                )
                .join(' ');
            

            【讨论】:

              【解决方案14】:

              以下是使用正则表达式演示驼峰式字符串到句子字符串的链接。

              输入

              myCamelCaseSTRINGToSPLITDemo

              输出

              my Camel Case STRING To SPLIT Demo


              这是将驼峰式大小写转换为句子文本的正则表达式

              (?=[A-Z][a-z])|([A-Z]+)([A-Z][a-rt-z][a-z]\*)
              

              用$1 $2 作为替代。

              Click to view the conversion on regex

              【讨论】:

              • 在答案正文中提供链接中的相关内容。
              【解决方案15】:

              我认为这可以通过 reg exp /([a-z]|[A-Z]+)([A-Z])/g 和替换 "$1 $2" 来完成。

              ILoveTheUSADope -> 我爱美国涂料

              【讨论】:

              • 不完全是,对于字符串QWERTY,它返回QWERT Y。
              【解决方案16】:

              根据上面的一个例子,我想出了这个:

              const camelToTitle = (camelCase) => camelCase
                .replace(/([A-Z])/g, (match) => ` ${match}`)
                .replace(/^./, (match) => match.toUpperCase())
                .trim()
              

              它对我有用,因为它使用.trim() 来处理第一个字母大写的边缘情况,你最终会得到一个额外的前导空格。

              参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

              【讨论】:

                【解决方案17】:

                输入 javascript

                输出 Java脚本

                   var text = 'javaScript';
                    text.replace(/([a-z])([A-Z][a-z])/g, "$1 $2").charAt(0).toUpperCase()+text.slice(1).replace(/([a-z])([A-Z][a-z])/g, "$1 $2");
                

                【讨论】:

                  【解决方案18】:

                  此实现考虑了连续的大写字母和数字。

                  function camelToTitleCase(str) {
                    return str
                      .replace(/[0-9]{2,}/g, match => ` ${match} `)
                      .replace(/[^A-Z0-9][A-Z]/g, match => `${match[0]} ${match[1]}`)
                      .replace(/[A-Z][A-Z][^A-Z0-9]/g, match => `${match[0]} ${match[1]}${match[2]}`)
                      .replace(/[ ]{2,}/g, match => ' ')
                      .replace(/\s./g, match => match.toUpperCase())
                      .replace(/^./, match => match.toUpperCase())
                      .trim();
                  }
                  
                  // ----------------------------------------------------- //
                  
                  var testSet = [
                      'camelCase',
                      'camelTOPCase',
                      'aP2PConnection',
                      'superSimpleExample',
                      'aGoodIPAddress',
                      'goodNumber90text',
                      'bad132Number90text',
                  ];
                  
                  testSet.forEach(function(item) {
                      console.log(item, '->', camelToTitleCase(item));
                  });

                  预期输出:

                  camelCase -> Camel Case
                  camelTOPCase -> Camel TOP Case
                  aP2PConnection -> A P2P Connection
                  superSimpleExample -> Super Simple Example
                  aGoodIPAddress -> A Good IP Address
                  goodNumber90text -> Good Number 90 Text
                  bad132Number90text -> Bad 132 Number 90 Text
                  

                  【讨论】:

                  • 我会使用 Chris Kline 的答案,它适用于“IP 地址”等字符串(此函数将其转换为“IP 地址”
                  • @JohnHamm 您的输入是“IP 地址”,对吧?这不是骆驼案!在这里了解什么是驼峰式案例:en.wikipedia.org/wiki/Camel_case 不要在两者之间放置空格并仅输入“IPAddress”。这个功能很好用。
                  【解决方案19】:

                  基于 RegEx 的另一种解决方案。

                  respace(str) {
                    const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g;
                    return str.replace(regex, '$& ');
                  }
                  

                  说明

                  上面的 RegEx 由 OR 运算符分隔的两个相似部分组成。上半场:

                  1. ([A-Z]) - 匹配大写字母...
                  2. (?=[A-Z][a-z]) - 后跟一系列大小写字母。

                  当应用于序列 FOo 时,这有效地匹配其 F 字母。

                  或者第二种情况:

                  1. ([a-z]) - 匹配小写字母...
                  2. (?=[A-Z]) - 后跟一个大写字母。

                  当应用于序列 barFoo 时,这有效地匹配其 r 字母。

                  找到所有替换候选后,最后要做的就是将它们替换为相同的字母,但附加一个空格字符。为此,我们可以使用'$&amp; ' 作为替换,它将解析为匹配的子字符串后跟一个空格字符。

                  示例

                  const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g
                  const testWords = ['ACoolExample', 'fooBar', 'INAndOUT', 'QWERTY', 'fooBBar']
                  
                  testWords.map(w => w.replace(regex, '$& '))
                  ->(5) ["A Cool Example", "foo Bar", "IN And OUT", "QWERTY", "foo B Bar"]
                  

                  【讨论】:

                  • 这太棒了。如果您在第二组末尾添加{2,},它也可以处理baseURLs(即,它将“s”附加到“URL”)。
                  • @diachedelic 是的,你是对的,刚刚测试过,这真的很有用。
                  • 啊,但“canAPIDoTask”失败 - 你得到“can APIDo Task”。这两个字母的单词是个问题。
                  【解决方案20】:

                  如果您处理 Capital Camel Case,此 sn-p 可以为您提供帮助,它还包含一些规格,因此您可以确保它与您的案例相匹配。

                  export const fromCamelCaseToSentence = (word) =>
                    word
                      .replace(/([A-Z][a-z]+)/g, ' $1')
                      .replace(/([A-Z]{2,})/g, ' $1')
                      .replace(/\s{2,}/g, ' ')
                      .trim();
                  

                  和规格:

                  describe('fromCamelCaseToSentence', () => {
                   test('does not fall with a single word', () => {
                     expect(fromCamelCaseToSentence('Approved')).toContain('Approved')
                     expect(fromCamelCaseToSentence('MDA')).toContain('MDA')
                   })
                  
                   test('does not fall with an empty string', () => {
                     expect(fromCamelCaseToSentence('')).toContain('')
                   })
                  
                   test('returns the separated by space words', () => {
                     expect(fromCamelCaseToSentence('NotApprovedStatus')).toContain('Not Approved Status')
                     expect(fromCamelCaseToSentence('GDBState')).toContain('GDB State')
                     expect(fromCamelCaseToSentence('StatusDGG')).toContain('Status DGG')
                   })
                  })
                  

                  【讨论】:

                    【解决方案21】:

                    卧底C程序员。如果您像我一样想保留首字母缩写词并且不想查看神秘模式,那么您可能会喜欢这样:

                    function isUpperCase (str) {
                      return str === str.toUpperCase()
                    }
                    
                    export function camelCaseToTitle (str) {
                      for (let i = str.length - 1; i > 0; i--) {
                        if (!isUpperCase(str[i - 1]) && isUpperCase(str[i])) {
                          str = str.slice(0, i) + ' ' + str.slice(i)
                        }
                      }
                      return str.charAt(0).toUpperCase() + str.slice(1)
                    }
                    

                    【讨论】:

                      【解决方案22】:

                      使用 JS 的 String.prototype.replace() 和 String.prototype.toUpperCase()

                      const str = "thisIsATestString";
                      const res = str.replace(/^[a-z]|[A-Z]/g, (c, i) => (i? " " : "") + c.toUpperCase());
                      
                      console.log(res);  // "This Is A Test String"

                      【讨论】:

                        【解决方案23】:

                        连续大写单词最兼容的答案是:

                        const text = 'theKD';
                        const result = text.replace(/([A-Z]{1,})/g, " $1");
                        const finalResult = result.charAt(0).toUpperCase() + result.slice(1);
                        console.log(finalResult);
                        • 它还与The KD 兼容,并且不会将其转换为The K D。

                        【讨论】:

                          【解决方案24】:

                          此解决方案也适用于不在 [A-Z] 范围内的其他 Unicode 字符。例如。 Ä、Ö、Å。

                          let camelCaseToTitleCase = (s) => (
                            s.split("").reduce(
                              (acc, letter, i) => (
                                i === 0 || console.log(acc, letter, i)
                                  ? [...acc, letter.toUpperCase()] 
                                  : letter === letter.toUpperCase()
                                  ? [...acc, " ", letter]
                                  : [...acc, letter] 
                              ), []
                            ).join("")
                          )
                          
                          const myString = "ArchipelagoOfÅland"
                          camelCaseToTitleCase(myString)
                          

                          【讨论】:

                            猜你喜欢
                            • 2022-05-24
                            • 2011-10-29
                            • 2021-08-14
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-09-21
                            • 1970-01-01
                            • 2017-08-13
                            • 1970-01-01
                            相关资源
                            最近更新 更多