我想知道如何在JavaScript中将字符串转换为帕斯卡命名法的字符串(最可能是使用正则表达式)。
转换示例:
- double-barrel = Double-Barrel
- DOUBLE-BARREL = Double-Barrel
- DoUbLE-BaRRel = Double-Barrel
- double barrel = Double Barrel
有关帕斯卡命名法的更多信息,请查看此链接。
我想知道如何在JavaScript中将字符串转换为帕斯卡命名法的字符串(最可能是使用正则表达式)。
转换示例:
有关帕斯卡命名法的更多信息,请查看此链接。
s = s.replace(/(\w)(\w*)/g,
function(g0,g1,g2){return g1.toUpperCase() + g2.toLowerCase();});
正则表达式找到单词(使用 \w
定义 - 包括字母数字和下划线),并将它们分为两组 - 第一个字母和剩余部分。然后使用函数作为回调来设置正确的大小写。s = s.replace(/\w+/g,
function(w){return w[0].toUpperCase() + w.slice(1).toLowerCase();});
需要说明:这并不是帕斯卡命名法,因为你有单词间的障碍(helloworld
与hello-world
)。如果没有它们,问题几乎无法解决,即使有字典也不行。这更常被称作标题案例,但它不能处理"FBI", "the" 或者 "McDonalds"这样的词语。
这是我的建议:
function toPascalCase(string) {
return `${string}`
.toLowerCase()
.replace(new RegExp(/[-_]+/, 'g'), ' ')
.replace(new RegExp(/[^\w\s]/, 'g'), '')
.replace(
new RegExp(/\s+(.)(\w*)/, 'g'),
($1, $2, $3) => `${$2.toUpperCase() + $3}`
)
.replace(new RegExp(/\w/), s => s.toUpperCase());
}
或者String.prototype.toPascalCase = function() {
return this
.toLowerCase()
.replace(new RegExp(/[-_]+/, 'g'), ' ')
.replace(new RegExp(/[^\w\s]/, 'g'), '')
.replace(
new RegExp(/\s+(.)(\w*)/, 'g'),
($1, $2, $3) => `${$2.toUpperCase() + $3}`
)
.replace(new RegExp(/\w/), s => s.toUpperCase());
};
测试用例:
describe('String to pascal case', function() {
it('should return a pascal cased string', function() {
chai.assert.equal(toPascalCase('foo bar'), 'FooBar');
chai.assert.equal(toPascalCase('Foo Bar'), 'FooBar');
chai.assert.equal(toPascalCase('fooBar'), 'FooBar');
chai.assert.equal(toPascalCase('FooBar'), 'FooBar');
chai.assert.equal(toPascalCase('--foo-bar--'), 'FooBar');
chai.assert.equal(toPascalCase('__FOO_BAR__'), 'FooBar');
chai.assert.equal(toPascalCase('!--foo-¿?-bar--121-**%'), 'FooBar121');
chai.assert.equal(toPascalCase('Here i am'), 'HereIAm');
chai.assert.equal(toPascalCase('FOO BAR'), 'FooBar');
});
});
${string}
更改为_${string}
,则对于第一个单词有效(这是我能找到的最不具侵入性的解决方法)。 - Andrew SamuelsonDouble-barrel
而不是DoubleBarrel
。 - nelson6e65.
分隔符的情况(即double.barrel
=> DoubleBarrel
)。 - quicklikerabbitfunction toPascalCase (str) {
if (/^[a-z\d]+$/i.test(str)) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
return str.replace(
/([a-z\d])([a-z\d]*)/gi,
(g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
).replace(/[^a-z\d]/gi, '');
}
我从Kobi's answer开始,使用了kalicki2k's answer中的Chai测试来进行测试。
通过将a-z
更改为\p{L}
并添加u
标志, 可以添加简单的多语言支持:
function toPascalCase (str) {
if (/^[\p{L}\d]+$/iu.test(str)) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
return str.replace(
/([\p{L}\d])([\p{L}\d]*)/giu,
(g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
).replace(/[^\p{L}\d]/giu, '');
}
只有在启用 Unicode 版本时才通过的两个额外测试:
chai.assert.equal(toPascalCase('ça.roule'), 'ÇaRoule');
chai.assert.equal(toPascalCase('добрий-день'), 'ДобрийДень');
顺便提一下,非 Unicode 版本大约比 Unicode 版本和 kalicki2k 的版本快两倍。但这并不重要,它们都足够快。
如果您需要缓存:
const pascalCache = {};
function toPascalCase (str) {
pascalCache[str] =
pascalCache[str] ||
(
/^[a-z\d]+$/i.test(str) &&
str.charAt(0).toUpperCase() + str.slice(1)
) ||
str.replace(
/([a-z\d])([a-z\d]*)/gi,
(g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
).replace(/[^a-z\d]/gi, '');
return pascalCache[str];
}
缓存加多语言:
const pascalCache = {};
function toPascalCase (str) {
pascalCache[str] =
pascalCache[str] ||
(
/^[\p{L}\d]+$/iu.test(str) &&
str.charAt(0).toUpperCase() + str.slice(1)
) ||
str.replace(
/([\p{L}\d])([\p{L}\d]*)/giu,
(g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
).replace(/[^\p{L}\d]/giu, '');
return pascalCache[str];
}
这些版本在基准测试中似乎快了很多(8倍),但当然这并不是真实世界使用的好代表。
str = str.replace(/((?<=[A-Z])[A-Z]+)/g, (_, g1) => g1.toLowerCase())
,
chai测试:
chai.assert.equal(toPascalCase('BAR'), 'Bar');
chai.assert.equal(toPascalCase('fooBARfoo'), 'FooBarfoo');
- chesirenconst toPascalCase = (text, trimSpace=false) => text.split(' ').map((t) => t[0].toUpperCase() + t.slice(1).toLowerCase()).join(trimSpace?'':' ')
const toPascalCase = (text, trimSpace=false) => text.split(' ').map((t) => t[0].toUpperCase() + t.slice(1).toLowerCase()).join(trimSpace?'':' ')
console.log(toPascalCase('hello world')); // Output: "Hello World"
console.log(toPascalCase('foo bar baz')); // Output: "Foo Bar Baz"
console.log(toPascalCase('this is a sample text')); // Output: "This Is A Sample Text"
const toPascalCase = (s: string | null | undefined) =>
s ? s.replace(/(\w)(\w*)/g, (_, p, q) => p.toUpperCase() + q.toLowerCase()) : s;
const toPascalCase = (sentence) => sentence
.toLowerCase()
.replace(new RegExp(/[-_]+/, 'g'), ' ')
.replace(new RegExp(/[^\w\s]/, 'g'), '')
.trim()
.split(' ')
.map(word => word[0]
.toUpperCase()
.concat(word.slice(1)))
.join('');
toPascalCase(words);
fooBar
转换为FooBar
,它将失败。 - Renan CoelhoDoUbLE
->Double
。如果您的情况不同,我相信您可以找到一个更合适的问题。 - Kobi