我有一个蛇形变量 big_animal
我想把它转换成 Big Animal
我的方法是 str => str.replace(/([-_]\w)/g, g => g[1].toUpperCase());
但我一直得到的是 bigAnimal
,而我想保留空格并将第一个字母大写。
我有一个蛇形变量 big_animal
我想把它转换成 Big Animal
我的方法是 str => str.replace(/([-_]\w)/g, g => g[1].toUpperCase());
但我一直得到的是 bigAnimal
,而我想保留空格并将第一个字母大写。
另一个简单的正则表达式版本:
const titleCase = (s) =>
s.replace(/^_*(.)|_+(.)/g, (s, c, d) => c ? c.toUpperCase() : ' ' + d.toUpperCase())
console .log (titleCase ('big_animal'))
console .log (titleCase ('_big_animal___with_more_Nodes'))
这个版本可以处理连续的下划线。它有单独匹配第一个字符(或以下划线开头的字符)和那些跟在一定数量下划线后面的字符的模式,对于后者添加了一个空格。
经过思考,我认为最好用两个正则表达式进行替换:
const titleCase = (s) =>
s.replace (/^[-_]*(.)/, (_, c) => c.toUpperCase()) // Initial char (after -/_)
.replace (/[-_]+(.)/g, (_, c) => ' ' + c.toUpperCase()) // First char after each -/_
console .log (titleCase ('big_animal'))
console .log (titleCase ('_big_animal___with-more--Nodes'))
这个变量还添加了对短横线命名法(kebab case)的处理。
首先按下划线拆分字符串,然后将第一个字母大写。
let str = "big_animal";
let ret = str
.split("_")
.filter(x => x.length > 0)
.map((x) => (x.charAt(0).toUpperCase() + x.slice(1)))
.join(" ");
console.log(ret);
如果你想坚持使用正则表达式方法。
let str = "big_animal_and_more"
let output = str.replace(/(^\w)/g, g => g[0].toUpperCase()).replace(/([-_]\w)/g, g => " " + g[1].toUpperCase()).trim();
console.log(output);
/**
* String Converter to convert snake_case to Title Case
* Eg.
* - quick_brown_fox -> Quick Brown Fox
* - quick_brown____fox -> Quick Brown Fox
* - quick_brown_fox----jumps_over -> Quick Brown Fox Jumps Over
*
*/
const convertSnakeToTitleCase = (s: string): string =>
s
.replace(/^[-_]*(.)/, (_, c: string) => c.toUpperCase())
.replace(/[-_]+(.)/g, (_, c: string) => ' ' + c.toUpperCase());
import { convertSnakeToTitleCase } from './helpers';
describe('convertSnakeToTitleCase helper function unit tests', () => {
it('returns correct output for regular snake case string', () => {
expect(convertSnakeToTitleCase('quick_brown_fox')).toBe('Quick Brown Fox');
});
it('returns correct output for snake case strings with consecutive underscores', () => {
expect(convertSnakeToTitleCase('quick_brown_____fox')).toBe(
'Quick Brown Fox'
);
});
it('returns correct output for snake case strings with hyphen separated strings', () => {
expect(convertSnakeToTitleCase('quick_brown_fox-----jumps_over')).toBe(
'Quick Brown Fox Jumps Over'
);
});
});
replace()
前添加toLowerCase()
可能也是可取的,以使其真正成为标题大小写。否则,您可能最终会得到big_aNIMAL
,结果将是Big ANIMAL
。 - Zei'my_HTML_renderer'
将变成'My Html Renderer'
,这也可能会带来问题。我认为,如果这是所期望的内容,最好调用titleCase(myString.toLowerCase())
。但因人而异。 - Scott Sauyetconst titleCase = (s) => s.replace(/^_*(.)|_+(.?)/g, (s, c, d) => c ? c.toUpperCase() : d ? ' ' + d.toUpperCase() : '');
- Tuhin Paul