如何在不排除任何特殊字符的情况下将驼峰大小写字符串转换为大小写句子?
建议使用正则表达式将具有特殊字符和数字的驼峰大小写字符串转换为大小写:
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 *`使用正则表达式可以吗?
发布于 2020-07-04 17:55:57
你得自己处理所有的案子:
[a-z](?=[A-Z]):小写字母后跟uppercase[a-zA-Z](?=[0-9]):字母,后跟digit[0-9](?=[a-zA-Z]):数字,后跟letter[a-zA-Z0-9](?=[^a-zA-Z0-9]):字母或数字,后面既不是字母也不是数字(可以使用you)[^a-zA-Z0-9](?=[a-zA-Z0-9]):和digit,但也可以使用\w和\W,因此直到you)
[^a-zA-Z0-9](?=[a-zA-Z0-9]):既不是字母也不是数字,后面既不是字母也不是数字digit
然后,您可以将它们放在一起:
([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),所以你需要特殊的花括号规则(参见下一节关于lookbehinds的帮助)。这是一项艰巨的工作,也很容易出错,而且我担心很难维护。
如果允许lookbehinds,则不需要捕获每个组中的第一个字符,而是将左边的模式包装在(?<=...)中,并直接替换为一个简单的空格:
(?<=[a-z])(?=[A-Z]):前面有小写字母,后面是uppercase(?<=[a-zA-Z])(?=[0-9]):,后面是字母,digit(?<=[0-9])(?=[a-zA-Z]):后面是数字,后面是letter(?<=[a-zA-Z0-9])(?=[^a-zA-Z0-9])(?!(?:\(s)?\)):,后面是字母或数字,后面不是字母或数字,后面也不是(s)或)(?<=[^a-zA-Z0-9])(?<!\()(?=[a-zA-Z0-9]):,前面既不是字母也不是数字,也不是(,后面是字母或数字或-ed在一起:
(?<=[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。
发布于 2020-07-04 18:08:06
想要的结果似乎不是规则的,一些特殊字符应该在前面加一个空格,而另一些则不是。像你想要的那样对待括号有点棘手。您可以使用函数来处理括号,如下所示:
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上使用不同的数据测试代码片段。
发布于 2020-07-04 17:44:19
这是不可能的。您不能在正则表达式中执行此操作。你将不得不考虑例外情况...
https://stackoverflow.com/questions/62727314
复制相似问题