将 JavaScript 中的字符串人性化
Humanize a string in JavaScript
如何将字符串人性化?基于以下标准:
- Deletes leading underscores, if any.
- Replaces underscores with spaces, if any.
- Capitalizes the first word.
例如:
this is a test -> This is a test
foo Bar Baz -> Foo bar baz
foo_bar -> Foo bar
foo_bar_baz -> Foo bar baz
foo-bar -> Foo-bar
fooBarBaz -> FooBarBaz
这涵盖了您的所有情况:
var tests = [
'this is a test',
'foo Bar Baz',
...
]
var res = tests.map(function(test) {
return test
.replace(/_/g, ' ')
.trim()
.replace(/\b[A-Z][a-z]+\b/g, function(word) {
return word.toLowerCase()
})
.replace(/^[a-z]/g, function(first) {
return first.toUpperCase()
})
})
console.log(res)
/*
[ 'This is a test',
'Foo bar baz',
'Foo bar',
'Foo-bar',
'FooBarBaz' ]
*/
虽然我认为正则表达式专家能够在一行中做这样的事情,但我个人会做这样的事情。
function humanize(str) {
return str.trim().split(/\s+/).map(function(str) {
return str.replace(/_/g, ' ').replace(/\s+/, ' ').trim();
}).join(' ').toLowerCase().replace(/^./, function(m) {
return m.toUpperCase();
});
}
测试:
[
' this is a test',
'foo Bar Baz',
'foo_bar',
'foo-bar',
'fooBarBaz',
'_fooBarBaz____',
'_alpha',
'hello_ _world, how are________you? '
].map(humanize);
/* Result:
[
"This is a test",
"Foo bar baz",
"Foo bar",
"Foo-bar",
"Foobarbaz",
"Foobarbaz",
"Alpha",
"Hello world, how are you?"
]
*/
最好确实使用一些正则表达式:
^[\s_]+|[\s_]+$
在开头 (^
) 或结尾 ($
) 处捕获 1 个或多个白色-space 字符或下划线细绳。 注意 这也会捕获换行符。将它们替换为空字符串。
[_\s]+
再次捕获 1 个或多个 white-space 字符或下划线,因为字符串 beginning/end 处的那些已经消失,替换为 1 space .
^[a-z]
抓取字符串开头的小写字母。替换为匹配的大写版本(你需要一个 callback 函数)。
合并:
function humanize(str) {
return str
.replace(/^[\s_]+|[\s_]+$/g, '')
.replace(/[_\s]+/g, ' ')
.replace(/^[a-z]/, function(m) { return m.toUpperCase(); });
}
document.getElementById('out').value = [
' this is a test',
'foo Bar Baz',
'foo_bar',
'foo-bar',
'fooBarBaz',
'_fooBarBaz____',
'_alpha',
'hello_ _world, how are________you? '
].map(humanize).join('\n');
textarea { width:100%; }
<textarea id="out" rows="10"></textarea>
Lodash 有 _.startCase
这对于人性化对象键很有用。将下划线、破折号和驼峰式大小写转换为空格。
在你的例子中,你想要大写但保持驼峰式大小写。不久前有人问过这个问题。我目前的偏好是创建一个 class 来处理突变。它更容易测试和维护。因此,如果将来您需要支持将“1Item”转换为 "First item",您可以编写一个具有单一职责的函数。
下面的计算成本更高,但更易于维护。有一个明确的功能toHumanString
,可以很容易地理解和修改。
export class HumanizableString extends String {
capitalizeFirstLetter() => {
const transformed = this.charAt(0).toUpperCase() + this.slice(1);
return new HumanizableString(transformed);
};
lowerCaseExceptFirst() => {
const transformed = this.charAt(0) + this.slice(1).toLowerCase();
return new HumanizableString(transformed);
};
camelCaseToSpaces() => {
const camelMatch = /([A-Z])/g;
return new HumanizableString(this.replace(camelMatch, " "));
};
underscoresToSpaces() => {
const camelMatch = /_/g;
return new HumanizableString(this.replace(camelMatch, " "));
};
toHumanString() => {
return this.camelCaseToSpaces()
.underscoresToSpaces()
.capitalizeFirstLetter()
.lowerCaseExceptFirst()
.toString();
};
}
至少你应该给你的正则表达式命名,使它们更具可读性。
export const humanise = (value) => {
const camelMatch = /([A-Z])/g;
const underscoreMatch = /_/g;
const camelCaseToSpaces = value.replace(camelMatch, " ");
const underscoresToSpaces = camelCaseToSpaces.replace(underscoreMatch, " ");
const caseCorrected =
underscoresToSpaces.charAt(0).toUpperCase() +
underscoresToSpaces.slice(1).toLowerCase();
return caseCorrected;
};
另一个选项:
const humanize = (s) => {
if (typeof s !== 'string') return s
return s
.replace(/^[\s_]+|[\s_]+$/g, '')
.replace(/[_\s]+/g, ' ')
.replace(/\-/g, ' ')
.replace(/^[a-z]/, function(m) { return m.toUpperCase(); });
}
如何将字符串人性化?基于以下标准:
- Deletes leading underscores, if any.
- Replaces underscores with spaces, if any.
- Capitalizes the first word.
例如:
this is a test -> This is a test
foo Bar Baz -> Foo bar baz
foo_bar -> Foo bar
foo_bar_baz -> Foo bar baz
foo-bar -> Foo-bar
fooBarBaz -> FooBarBaz
这涵盖了您的所有情况:
var tests = [
'this is a test',
'foo Bar Baz',
...
]
var res = tests.map(function(test) {
return test
.replace(/_/g, ' ')
.trim()
.replace(/\b[A-Z][a-z]+\b/g, function(word) {
return word.toLowerCase()
})
.replace(/^[a-z]/g, function(first) {
return first.toUpperCase()
})
})
console.log(res)
/*
[ 'This is a test',
'Foo bar baz',
'Foo bar',
'Foo-bar',
'FooBarBaz' ]
*/
虽然我认为正则表达式专家能够在一行中做这样的事情,但我个人会做这样的事情。
function humanize(str) {
return str.trim().split(/\s+/).map(function(str) {
return str.replace(/_/g, ' ').replace(/\s+/, ' ').trim();
}).join(' ').toLowerCase().replace(/^./, function(m) {
return m.toUpperCase();
});
}
测试:
[
' this is a test',
'foo Bar Baz',
'foo_bar',
'foo-bar',
'fooBarBaz',
'_fooBarBaz____',
'_alpha',
'hello_ _world, how are________you? '
].map(humanize);
/* Result:
[
"This is a test",
"Foo bar baz",
"Foo bar",
"Foo-bar",
"Foobarbaz",
"Foobarbaz",
"Alpha",
"Hello world, how are you?"
]
*/
最好确实使用一些正则表达式:
^[\s_]+|[\s_]+$
在开头 (^
) 或结尾 ($
) 处捕获 1 个或多个白色-space 字符或下划线细绳。 注意 这也会捕获换行符。将它们替换为空字符串。
[_\s]+
再次捕获 1 个或多个 white-space 字符或下划线,因为字符串 beginning/end 处的那些已经消失,替换为 1 space .
^[a-z]
抓取字符串开头的小写字母。替换为匹配的大写版本(你需要一个 callback 函数)。
合并:
function humanize(str) {
return str
.replace(/^[\s_]+|[\s_]+$/g, '')
.replace(/[_\s]+/g, ' ')
.replace(/^[a-z]/, function(m) { return m.toUpperCase(); });
}
document.getElementById('out').value = [
' this is a test',
'foo Bar Baz',
'foo_bar',
'foo-bar',
'fooBarBaz',
'_fooBarBaz____',
'_alpha',
'hello_ _world, how are________you? '
].map(humanize).join('\n');
textarea { width:100%; }
<textarea id="out" rows="10"></textarea>
Lodash 有 _.startCase
这对于人性化对象键很有用。将下划线、破折号和驼峰式大小写转换为空格。
在你的例子中,你想要大写但保持驼峰式大小写。不久前有人问过这个问题。我目前的偏好是创建一个 class 来处理突变。它更容易测试和维护。因此,如果将来您需要支持将“1Item”转换为 "First item",您可以编写一个具有单一职责的函数。
下面的计算成本更高,但更易于维护。有一个明确的功能toHumanString
,可以很容易地理解和修改。
export class HumanizableString extends String {
capitalizeFirstLetter() => {
const transformed = this.charAt(0).toUpperCase() + this.slice(1);
return new HumanizableString(transformed);
};
lowerCaseExceptFirst() => {
const transformed = this.charAt(0) + this.slice(1).toLowerCase();
return new HumanizableString(transformed);
};
camelCaseToSpaces() => {
const camelMatch = /([A-Z])/g;
return new HumanizableString(this.replace(camelMatch, " "));
};
underscoresToSpaces() => {
const camelMatch = /_/g;
return new HumanizableString(this.replace(camelMatch, " "));
};
toHumanString() => {
return this.camelCaseToSpaces()
.underscoresToSpaces()
.capitalizeFirstLetter()
.lowerCaseExceptFirst()
.toString();
};
}
至少你应该给你的正则表达式命名,使它们更具可读性。
export const humanise = (value) => {
const camelMatch = /([A-Z])/g;
const underscoreMatch = /_/g;
const camelCaseToSpaces = value.replace(camelMatch, " ");
const underscoresToSpaces = camelCaseToSpaces.replace(underscoreMatch, " ");
const caseCorrected =
underscoresToSpaces.charAt(0).toUpperCase() +
underscoresToSpaces.slice(1).toLowerCase();
return caseCorrected;
};
另一个选项:
const humanize = (s) => {
if (typeof s !== 'string') return s
return s
.replace(/^[\s_]+|[\s_]+$/g, '')
.replace(/[_\s]+/g, ' ')
.replace(/\-/g, ' ')
.replace(/^[a-z]/, function(m) { return m.toUpperCase(); });
}