Intenta entender el código de forma correcta antes de aplicarlo a tu proyecto si tdeseas aportar algo puedes decirlo en los comentarios.
Solución:
s = s.replace(/(w)(w*)/g,
function(g0,g1,g2)return g1.toUpperCase() + g2.toLowerCase(););
La expresión regular encuentra palabras (definidas aquí usando w
– alfanuméricos y guiones bajos) y los separa en dos grupos: la primera letra y el resto de la palabra. A continuación, utiliza una función como devolución de llamada para establecer el caso adecuado.
Ejemplo: http://jsbin.com/uvase
Alternativamente, esto también funcionará: un poco menos de expresiones regulares y más string manipulación:
s = s.replace(/w+/g,
function(w)return w[0].toUpperCase() + w.slice(1).toLowerCase(););
Debo agregar que este no es un caso pascal en absoluto, ya que tienes barreras de palabras (helloworld
contra hello-world
). Sin ellos, el problema es casi irresoluble, incluso con un diccionario. Esto se denomina más comúnmente Caso de título, aunque no maneja palabras como “FBI”, “el” o “McDonalds”.
Aquí está mi sugerencia:
function toPascalCase(string)
return `$string`
.replace(new RegExp(/[-_]+/, 'g'), ' ')
.replace(new RegExp(/[^ws]/, 'g'), '')
.replace(
new RegExp(/s+(.)(w+)/, 'g'),
($1, $2, $3) => `$$2.toUpperCase() + $3.toLowerCase()`
)
.replace(new RegExp(/s/, 'g'), '')
.replace(new RegExp(/w/), s => s.toUpperCase());
o
String.prototype.toPascalCase = function()
return this
.replace(new RegExp(/[-_]+/, 'g'), ' ')
.replace(new RegExp(/[^ws]/, 'g'), '')
.replace(
new RegExp(/s+(.)(w+)/, 'g'),
($1, $2, $3) => `$$2.toUpperCase() + $3.toLowerCase()`
)
.replace(new RegExp(/s/, 'g'), '')
.replace(new RegExp(/w/), s => s.toUpperCase());
;
Casos de prueba:
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');
);
);
En caso de guión, espacio y otros son string separadores uno puede usar lodash.
p.ej
_.upperFirst(_.camelCase('double-barrel')); // => DoubleBarrel
valoraciones y comentarios
Más adelante puedes encontrar las interpretaciones de otros sys admins, tú también tienes la habilidad dejar el tuyo si te apetece.