如何将驼峰字符串转换为句子大小写而不排除任何特殊字符?
建议使用正则表达式将带有特殊字符和数字的驼峰字符串转换为句子大小写?:
const string = `includes:SummaryFromDetailHistory1990-AsAbstract`
预期结果:
Includes : Summary From Detail History 1990 - As Abstract
目前我正在使用 lodash startCase 将camelCased 转换为sentenceCase。但这种方法的问题是它删除了特殊字符,如方括号、数字、圆括号、连字符、冒号等......(大多数特殊字符)
所以我们的想法是将驼峰字符串转换为句子大小写,同时保留字符串标识
例如:
const anotherString = `thisIsA100CharactersLong:SampleStringContaining-SpecialChar(s)10&20*`
const expectedReturn = `This Is A 100 Characters : Long Sample String Containing - Special Char(s) 10 & 20 *`
用正则表达式可以吗?
您必须亲自处理所有案件:
[a-z](?=[A-Z])
:小写后大写[a-zA-Z](?=[0-9])
:字母后跟数字[0-9](?=[a-zA-Z])
:数字后跟字母[a-zA-Z0-9](?=[^a-zA-Z0-9])
:字母或数字后跟既不字母也不数字(可以使用\w
和\W
,但它们也涵盖_
,所以由你决定)[^a-zA-Z0-9](?=[a-zA-Z0-9])
:不是字母也不是数字,后跟字母或数字然后,您可以或将它们放在一起:
([a-z](?=[A-Z])|[a-zA-Z](?=[0-9])|[0-9](?=[a-zA-Z])|[a-zA-Z0-9](?=[^a-zA-Z0-9])|[^a-zA-Z0-9](?=[a-zA-Z0-9]))
并替换为:
$1
(参见
$1
后面的空格)。
参见 https://regex101.com/r/4AVbAs/1 例如。
不过你会遇到边缘情况,例如
Char(s)
,因此您需要例如括号的特殊规则(请参阅以下有关向后查找的部分,这可以对此有所帮助)。这是一项艰巨的工作,也很容易出错,而且恐怕很难维护。
如果允许lookbehind,则不需要捕获每个组中的第一个字符,而是将 left 模式 包装在
(?<=...)
中并直接替换为简单的空格:
(?<=[a-z])(?=[A-Z])
:前面是小写,后面是大写(?<=[a-zA-Z])(?=[0-9])
:前面是字母,后面是数字(?<=[0-9])(?=[a-zA-Z])
:前面是数字,后面是字母(?<=[a-zA-Z0-9])(?=[^a-zA-Z0-9])(?!(?:\(s)?\))
:前面是字母或数字,后面不是字母也不是数字,以及后面不是 (s)
也不是 )
(?<=[^a-zA-Z0-9])(?<!\()(?=[a-zA-Z0-9])
:前面不是字母或数字,以及前面不是(
,后面是字母或数字或-一起:
(?<=[a-z])(?=[A-Z])|(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])|(?<=[a-zA-Z0-9])(?=[^a-zA-Z0-9])(?!(?:\(s)?\))|(?<=[^a-zA-Z0-9])(?<!\()(?=[a-zA-Z0-9])
替换为空格,请参阅https://regex101.com/r/DB91DE/1。
想要的结果似乎并不规则,一些特殊字符应该在前面加空格,而有些则不然。按照您想要的方式处理括号有点棘手。您可以使用函数来处理括号,如下所示:
let parenth = 0;
const str = `thisIsA100CharactersLong:SampleStringContaining-SpecialChar(s)10&20*`,
spaced = str.replace(/[A-Z]|\d+|\W/g, (m) => {
if (m === '(') {
parenth = 1;
return m;
}
if (parenth || m === ')') {
parenth = 0;
return m;
}
return ` ${m}`;
});
console.log(spaced);
如果数据可以包含其他括号,则不只是检查括号,而是使用 RexExp 测试任何左括号:
if (/[({[]/.test(m)) ...
,并测试右括号:if (/[)}\]]/.test(m)) ...
。
您可以在 jsFiddle 使用不同的数据测试片段。
这是不可能的。您不能在正则表达式中执行此操作。您必须考虑例外情况...