将 camelCaseText 转换为句子大小写文本

Posted

技术标签:

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

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

【问题讨论】:

hmm.. 您对 iLiveInTheUSA 的预期输出是什么? 我住在美国...哦,废话! - 但就我而言,我有一组有限的字符串,并且没有这样的字符串可以破坏一个简单的转换器。不过很好! 同样的 uSBPort 应该会产生“USB Port” @wim:iLiveInTheUSA 应该是 iLiveInTheUsa 的正确驼峰式表示法,但这会带来不同的问题。 HelloThere -> 你好没有作为标题格的句子 【参考方案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 等不同模式:例如lowersplit。然后做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来防止正则表达式引擎消耗过多的字符:

    [A-Z](?=[A-Z][a-z]) 查找一个大写字母,后跟一个大写字母,然后是一个小写字母。这是为了结束像 USA 这样的首字母缩略词。 [^A-Z](?=[A-Z]) 查找后跟大写字母的非大写字母。这将结束诸如 myWord 之类的单词和 99Bottles 之类的符号。 [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 任务提供快捷方式。还有许多其他类似的字符串操作函数,例如 camelCasekebabCase 等。

【讨论】:

如果你要尝试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 运算符分隔的两个相似部分组成。上半场:

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

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

或者第二种情况:

    ([a-z]) - 匹配小写字母... (?=[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(/\s2,/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)

【讨论】:

以上是关于将 camelCaseText 转换为句子大小写文本的主要内容,如果未能解决你的问题,请参考以下文章

Ruby中的大写,交换大小写和反转[重复]

java大小写转换

写一个Linux C程序,将一个文本文件中的所有小写字母转换为大写字母。

将句子转换为嵌入表示

java大小写转换

使用 XSLT 将 XML 转换为带有嵌套 AND/OR 的“布尔”英文句子