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

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

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

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

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

lymnna71

lymnna711#

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

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

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”这样的词。

yzuktlbb

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');
  });
});
lbsnaicq

lbsnaicq3#

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

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

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标志来添加原始的多语言支持:

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倍),但当然这并不能很好地代表现实世界的使用。

hvvq6cgz

hvvq6cgz5#

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

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

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"
hxzsmxv2

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);

相关问题