regex 在JavaScript中将字符串转换为Pascal Case(aka UpperCamelCase)

eeq64g8w  于 2023-10-22  发布在  Java
关注(0)|答案(7)|浏览(110)

我想知道如何在JavaScript中将字符串转换为pascal大小写字符串(很可能是regex)。
转换示例:

  • 双管
  • DOUBLE-BARREL =双管
  • DOUbLE-BaRRel =双管
  • 双桶=双桶

查看this link以获取有关Pascal Case的更多信息

lymnna71

lymnna711#

  1. s = s.replace(/(\w)(\w*)/g,
  2. function(g0,g1,g2){return g1.toUpperCase() + g2.toLowerCase();});

正则表达式查找单词(这里使用\w-字符和下划线定义),并将它们分为两组-单词的第一个字母和其余部分。然后它使用一个函数作为回调来设置正确的大小写。
示例:http://jsbin.com/uvase
或者,这也可以工作-少一点正则表达式和更多的字符串操作:

  1. s = s.replace(/\w+/g,
  2. function(w){return w[0].toUpperCase() + w.slice(1).toLowerCase();});

我应该补充一点,这根本不是pascal的情况,因为你有单词障碍(helloworld vs hello-world)。没有它们,这个问题几乎是无法解决的,即使有字典。这通常被称为Title Case,尽管它不处理像“FBI”,“the”或“McDonalds”这样的词。

yzuktlbb

yzuktlbb2#

以下是我的建议:

  1. function toPascalCase(string) {
  2. return `${string}`
  3. .toLowerCase()
  4. .replace(new RegExp(/[-_]+/, 'g'), ' ')
  5. .replace(new RegExp(/[^\w\s]/, 'g'), '')
  6. .replace(
  7. new RegExp(/\s+(.)(\w*)/, 'g'),
  8. ($1, $2, $3) => `${$2.toUpperCase() + $3}`
  9. )
  10. .replace(new RegExp(/\w/), s => s.toUpperCase());
  11. }

  1. String.prototype.toPascalCase = function() {
  2. return this
  3. .toLowerCase()
  4. .replace(new RegExp(/[-_]+/, 'g'), ' ')
  5. .replace(new RegExp(/[^\w\s]/, 'g'), '')
  6. .replace(
  7. new RegExp(/\s+(.)(\w*)/, 'g'),
  8. ($1, $2, $3) => `${$2.toUpperCase() + $3}`
  9. )
  10. .replace(new RegExp(/\w/), s => s.toUpperCase());
  11. };

测试用例:

  1. describe('String to pascal case', function() {
  2. it('should return a pascal cased string', function() {
  3. chai.assert.equal(toPascalCase('foo bar'), 'FooBar');
  4. chai.assert.equal(toPascalCase('Foo Bar'), 'FooBar');
  5. chai.assert.equal(toPascalCase('fooBar'), 'FooBar');
  6. chai.assert.equal(toPascalCase('FooBar'), 'FooBar');
  7. chai.assert.equal(toPascalCase('--foo-bar--'), 'FooBar');
  8. chai.assert.equal(toPascalCase('__FOO_BAR__'), 'FooBar');
  9. chai.assert.equal(toPascalCase('!--foo-¿?-bar--121-**%'), 'FooBar121');
  10. chai.assert.equal(toPascalCase('Here i am'), 'HereIAm');
  11. chai.assert.equal(toPascalCase('FOO BAR'), 'FooBar');
  12. });
  13. });
展开查看全部
lbsnaicq

lbsnaicq3#

如果破折号、空格和其他是字符串分隔符,则可以使用lodash。
例如

  1. _.upperFirst(_.camelCase('double-barrel')); // => DoubleBarrel
vnzz0bqm

vnzz0bqm4#

  1. function toPascalCase (str) {
  2. if (/^[a-z\d]+$/i.test(str)) {
  3. return str.charAt(0).toUpperCase() + str.slice(1);
  4. }
  5. return str.replace(
  6. /([a-z\d])([a-z\d]*)/gi,
  7. (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
  8. ).replace(/[^a-z\d]/gi, '');
  9. }

我从Kobi的答案开始,并使用kalicki2k的答案中的Chai测试来踢轮胎。
可以通过将a-z更改为\p{L}并添加u标志来添加原始的多语言支持:

  1. function toPascalCase (str) {
  2. if (/^[\p{L}\d]+$/iu.test(str)) {
  3. return str.charAt(0).toUpperCase() + str.slice(1);
  4. }
  5. return str.replace(
  6. /([\p{L}\d])([\p{L}\d]*)/giu,
  7. (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
  8. ).replace(/[^\p{L}\d]/giu, '');
  9. }

两个额外的测试只通过启用Unicode的版本:

  1. chai.assert.equal(toPascalCase('ça.roule'), 'ÇaRoule');
  2. chai.assert.equal(toPascalCase('добрий-день'), 'ДобрийДень');

顺便说一句,非unicode版本的速度大约是unicode版本的两倍kalicki2k版本。这并不重要,他们都很快。
如果需要缓存:

  1. const pascalCache = {};
  2. function toPascalCase (str) {
  3. pascalCache[str] =
  4. pascalCache[str] ||
  5. (
  6. /^[a-z\d]+$/i.test(str) &&
  7. str.charAt(0).toUpperCase() + str.slice(1)
  8. ) ||
  9. str.replace(
  10. /([a-z\d])([a-z\d]*)/gi,
  11. (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
  12. ).replace(/[^a-z\d]/gi, '');
  13. return pascalCache[str];
  14. }

缓存加多语言:

  1. const pascalCache = {};
  2. function toPascalCase (str) {
  3. pascalCache[str] =
  4. pascalCache[str] ||
  5. (
  6. /^[\p{L}\d]+$/iu.test(str) &&
  7. str.charAt(0).toUpperCase() + str.slice(1)
  8. ) ||
  9. str.replace(
  10. /([\p{L}\d])([\p{L}\d]*)/giu,
  11. (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
  12. ).replace(/[^\p{L}\d]/giu, '');
  13. return pascalCache[str];
  14. }

这些版本在基准测试中似乎快得多(8倍),但当然这并不能很好地代表现实世界的使用。

展开查看全部
hvvq6cgz

hvvq6cgz5#

这个答案的一行Typescript版本,它也处理null/undefined字符串:

  1. const toPascalCase = (s: string | null | undefined) =>
  2. s ? s.replace(/(\w)(\w*)/g, (_, p, q) => p.toUpperCase() + q.toLowerCase()) : s;
zwghvu4y

zwghvu4y6#

带有修剪空间选项的简单版本:

  1. const toPascalCase = (text, trimSpace=false) => text.split(' ').map((t) => t[0].toUpperCase() + t.slice(1).toLowerCase()).join(trimSpace?'':' ')

测试:

  1. const toPascalCase = (text, trimSpace=false) => text.split(' ').map((t) => t[0].toUpperCase() + t.slice(1).toLowerCase()).join(trimSpace?'':' ')
  2. console.log(toPascalCase('hello world')); // Output: "Hello World"
  3. console.log(toPascalCase('foo bar baz')); // Output: "Foo Bar Baz"
  4. console.log(toPascalCase('this is a sample text')); // Output: "This Is A Sample Text"
hxzsmxv2

hxzsmxv27#

  1. const toPascalCase = (sentence) => sentence
  2. .toLowerCase()
  3. .replace(new RegExp(/[-_]+/, 'g'), ' ')
  4. .replace(new RegExp(/[^\w\s]/, 'g'), '')
  5. .trim()
  6. .split(' ')
  7. .map(word => word[0]
  8. .toUpperCase()
  9. .concat(word.slice(1)))
  10. .join('');
  11. toPascalCase(words);

相关问题