如何在JavaScript中将字符串“ helloThere”或“ HelloThere”转换为“ Hello There”?
如何在JavaScript中将字符串“ helloThere”或“ HelloThere”转换为“ Hello There”?
Answers:
var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1);
console.log(finalResult);
以首字母大写为例。
注意中的空格" $1"
。
编辑:添加了首个字母大写的示例。当然,如果第一个字母已经是大写字母-您将有一个备用空间来删除。
text.replace
,我也一直在为函数调用填充2个以上带有空格的参数以提高可读性
Non-GoogleChrome
呢?
或者使用lodash:
lodash.startCase(str);
例:
_.startCase('helloThere');
// ➜ 'Hello There'
Lodash是一个很好的图书馆给快捷方式到许多日常JS tasks.There是许多其他类似的字符串处理函数,例如camelCase
,kebabCase
等等。
hello world
则输出应为Hello There
,在这种情况下,loadash将无济于事。
hello there
了hello world
。
我有一个类似的问题,并这样处理:
stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")
对于更强大的解决方案:
stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")
输入:
helloThere
HelloThere
ILoveTheUSA
iLoveTheUSA
输出:
hello There
Hello There
I Love The USA
i Love The USA
没有副作用的例子。
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());
我找到的用于测试驼峰大小写到标题大小写功能的最佳字符串是这个荒谬的,毫无意义的示例,它测试了许多边缘情况。据我所知,以前发布的函数均无法正确处理此问题:
马上获得有关GED的基本信息,但对于用户456在房间26A中包含个人ID卡,包含ABC26的时间就不那么容易了,因为C3POOrR2D2Or2R2D
这应该转换为:
及时获取GED的本质是一首关于26 ABC的歌曲,但是在房间26A中包含ABC 26次的用户456的个人ID卡并不像C3PO或R2D2或2R2D的123那样容易
如果您只需要一个简单的函数来处理上述情况(比以前的答案要多的情况),这就是我写的一个。这段代码并不是特别优雅或快速,但是它简单,易于理解并且可以正常工作。
一个在线可运行示例在jsfiddle上,或者您可以在控制台中查看以下代码段的输出:
// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
//
// E.g.:
var examples = [
'ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D',
// --> 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', // --> 1 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 // "ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
.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();
// capitalize the first letter
return result.charAt(0).toUpperCase() + result.slice(1);
}
examples.forEach(str => console.log(str, ' --> \n', camelCaseToTitleCase(str)));
基于以上示例之一,我想到了这一点:
const camelToTitle = (camelCase) => camelCase
.replace(/([A-Z])/g, (match) => ` ${match}`)
.replace(/^./, (match) => match.toUpperCase())
.trim()
它对我有用.trim()
,因为它用于处理首字母大写的小写情况,最终导致多余的空格。
参考:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
好的,我迟到了几年,但是我有一个类似的问题,我想为每一个可能的输入提供一个替代解决方案。我必须给大部分的功劳要@ZenMaster该线程和@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 < a.length; i++){
text = a[i];
text = text.replace(camelEdges,'$1 ');
text = text.charAt(0).toUpperCase() + text.slice(1);
resultArray.push(text);
}
它具有三个子句,所有子句都使用前瞻性来防止正则表达式引擎占用太多字符:
[A-Z](?=[A-Z][a-z])
查找大写字母,后跟一个大写字母然后是一个小写字母。这是结束像美国这样的缩写词。[^A-Z](?=[A-Z])
寻找一个非大写字母,后跟一个大写字母。这样就结束了诸如myWord之类的单词和诸如99Bottles之类的符号。[a-zA-Z](?=[^a-zA-Z])
寻找字母,后跟非字母。这会在BFG9000之类的符号之前结束单词。这个问题位于我搜索结果的顶部,因此希望我可以节省一些时间!
这是我的版本。它在每个小写英文字母之后的每个大写英文字母之前添加一个空格,并在需要时将首字母大写:
例如:
thisIsCamelCase->这是骆驼案例
this IsCamelCase->这是骆驼案例
thisIsCamelCase123- >这是骆驼案例
123
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;
}
此实现考虑连续的大写字母和数字。
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
您可以使用如下功能:
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"
用于例如。
试试这个图书馆
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"
上面的答案都不适合我,因此必须自备自行车:
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'
这对我有用
CamelcaseToWord(“ MyName”); //返回我的名字
function CamelcaseToWord(string){
return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
}
string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, "$1");
我认为这可以通过reg exp /([a-z]|[A-Z]+)([A-Z])/g
和replace来完成"$1 $2"
。
ILoveTheUSADope->我爱美国涂料
QWERTY
它返回QWERT Y
。
如果您处理的是Capital Camel Case,此代码段可以为您提供帮助,并且其中包含一些规格,因此您可以确定它与您的情况相匹配。
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')
})
})
我没有尝试每个人的答案,但是我尝试过的一些解决方案并不符合我的所有要求。
我想出了一些能做到的...
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(),
'')
以下是使用正则表达式演示骆驼式案例字符串到句子字符串的链接。
myCamelCaseSTRINGToSPLITDemo
my Camel Case STRING To SPLIT Demo
这是用于将驼峰式案例转换为句子文本的正则表达式
(?=[A-Z][a-z])|([A-Z]+)([A-Z][a-rt-z][a-z]\*)
与$1 $2
作为替代。
基于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"]
在对上述一些想法不满意之后,添加了另一个我更喜欢的ES6解决方案。
https://codepen.io/902Labs/pen/mxdxRv?editors=0010#0
const camelize = (str) => str
.split(' ')
.map(([first, ...theRest]) => (
`${first.toUpperCase()}${theRest.join('').toLowerCase()}`)
)
.join(' ');