将 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
等不同模式:例如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来防止正则表达式引擎消耗过多的字符:
[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 />");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
【讨论】:
下划线间隔的测试用例不再起作用,只是提醒一下。添加:.replace(/_/g,' ')
解决了这个问题。另外,添加.replace(\&\, ' & ')
支持与符拆分
感谢@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 运算符分隔的两个相似部分组成。上半场:
([A-Z])
- 匹配大写字母...
(?=[A-Z][a-z])
- 后跟一系列大小写字母。
当应用于序列 FOo 时,这有效地匹配其 F 字母。
或者第二种情况:
([a-z])
- 匹配小写字母...
(?=[A-Z])
- 后跟一个大写字母。
当应用于序列 barFoo 时,这有效地匹配其 r 字母。
找到所有替换候选后,最后要做的就是将它们替换为相同的字母,但附加一个空格字符。为此,我们可以使用'$& '
作为替换,它将解析为匹配的子字符串后跟一个空格字符。
示例
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 转换为句子大小写文本的主要内容,如果未能解决你的问题,请参考以下文章