我想知道如何在JavaScript中将字符串转换为pascal大小写字符串(很可能是regex)。转换示例:
查看this link以获取有关Pascal Case的更多信息
lymnna711#
s = s.replace(/(\w)(\w*)/g, function(g0,g1,g2){return g1.toUpperCase() + g2.toLowerCase();});
正则表达式查找单词(这里使用\w-字符和下划线定义),并将它们分为两组-单词的第一个字母和其余部分。然后它使用一个函数作为回调来设置正确的大小写。示例:http://jsbin.com/uvase或者,这也可以工作-少一点正则表达式和更多的字符串操作:
\w
s = s.replace(/\w+/g, function(w){return w[0].toUpperCase() + w.slice(1).toLowerCase();});
我应该补充一点,这根本不是pascal的情况,因为你有单词障碍(helloworld vs hello-world)。没有它们,这个问题几乎是无法解决的,即使有字典。这通常被称为Title Case,尽管它不处理像“FBI”,“the”或“McDonalds”这样的词。
helloworld
hello-world
yzuktlbb2#
以下是我的建议:
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'); }); });
lbsnaicq3#
如果破折号、空格和其他是字符串分隔符,则可以使用lodash。例如
_.upperFirst(_.camelCase('double-barrel')); // => DoubleBarrel
vnzz0bqm4#
function 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的答案开始,并使用kalicki2k的答案中的Chai测试来踢轮胎。可以通过将a-z更改为\p{L}并添加u标志来添加原始的多语言支持:
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倍),但当然这并不能很好地代表现实世界的使用。
hvvq6cgz5#
这个答案的一行Typescript版本,它也处理null/undefined字符串:
const toPascalCase = (s: string | null | undefined) => s ? s.replace(/(\w)(\w*)/g, (_, p, q) => p.toUpperCase() + q.toLowerCase()) : s;
zwghvu4y6#
带有修剪空间选项的简单版本:
const 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"
hxzsmxv27#
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);
7条答案
按热度按时间lymnna711#
正则表达式查找单词(这里使用
\w
-字符和下划线定义),并将它们分为两组-单词的第一个字母和其余部分。然后它使用一个函数作为回调来设置正确的大小写。示例:http://jsbin.com/uvase
或者,这也可以工作-少一点正则表达式和更多的字符串操作:
我应该补充一点,这根本不是pascal的情况,因为你有单词障碍(
helloworld
vshello-world
)。没有它们,这个问题几乎是无法解决的,即使有字典。这通常被称为Title Case,尽管它不处理像“FBI”,“the”或“McDonalds”这样的词。yzuktlbb2#
以下是我的建议:
或
测试用例:
lbsnaicq3#
如果破折号、空格和其他是字符串分隔符,则可以使用lodash。
例如
vnzz0bqm4#
我从Kobi的答案开始,并使用kalicki2k的答案中的Chai测试来踢轮胎。
可以通过将
a-z
更改为\p{L}
并添加u
标志来添加原始的多语言支持:两个额外的测试只通过启用Unicode的版本:
顺便说一句,非unicode版本的速度大约是unicode版本的两倍kalicki2k版本。这并不重要,他们都很快。
如果需要缓存:
缓存加多语言:
这些版本在基准测试中似乎快得多(8倍),但当然这并不能很好地代表现实世界的使用。
hvvq6cgz5#
这个答案的一行Typescript版本,它也处理null/undefined字符串:
zwghvu4y6#
带有修剪空间选项的简单版本:
测试:
hxzsmxv27#