Javascript 如何在不排除任何特殊字符的情况下将大小写字符串转换为句子大小写?

Javascript 如何在不排除任何特殊字符的情况下将大小写字符串转换为句子大小写?,javascript,Javascript,如何在不排除任何特殊字符的情况下将大小写字符串转换为句子大小写 建议使用正则表达式将带特殊字符和数字的camelcased字符串转换为句子大小写?: const string = `includes:SummaryFromDetailHistory1990-AsAbstract` 预期成果: Includes : Summary From Detail History 1990 - As Abstract 目前我正在使用lodash startCase将camelCased转换为senten

如何在不排除任何特殊字符的情况下将大小写字符串转换为句子大小写

建议使用正则表达式将带特殊字符和数字的camelcased字符串转换为句子大小写?:

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]))
(?<=[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])
并替换为:

$1 
(请参见
$1
后面的空格)

例如,见

不过,您会遇到一些边缘情况,例如,
Char
,因此您需要针对paren的特殊规则,例如(请参阅下面关于lookbehinds的部分,这些规则可能会有所帮助)。这项工作有点难,也很容易出错,恐怕很难维护


如果允许lookbehind,则不需要捕获每个组中的第一个字符,而是将左侧的模式包装在
(?或ed)中:

([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]))
(?<=[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])

(?想要的结果似乎不是规则的,一些特殊字符应该在前面加空格,而另一些则不是。像对待括号一样对待括号有点棘手。可以使用函数来处理括号,如下所示:

让parenth=0;
const str=`thisIsA100CharactersLong:SampleString包含特殊字符10和20*`,
间隔=str.replace(/[A-Z]|\d+|\W/g,(m)=>{
如果(m=='('){
parenth=1;
返回m;
}
if(parenth | | m===')'){
parenth=0;
返回m;
}
返回`${m}`;
});

console.log(空格);
每个特殊字符前面都有一个空格&两个单词之间有一个空格。但是像“characters(s)”这样的例外-在这里应该是与字符,对于其他像“包括:”应该成为“包括:”和其他像“容器-”应该成为“容器”……像明智的!它也应该考虑保存数字块。例如,“这个IS2020年”变成“这是2020年”是允许的吗?实际上,把括号当作“常规字符”来处理。在正则表达式中,可以通过将
\W
替换为
[^\W()]
@Befeepilf来完成。我试过了,但它在特定的组合中弄乱了间距。如果你有一个纯正则表达式这样做的想法,请给出一个答案。“它弄乱了正则表达式的其他部分”是什么意思?括号呢?这也会预加空格,这是OP不想要的。@Teemu是的,我需要lookbehinds,不确定是否允许,等待OP的答案。@Teemu没有得到OP的答案,所以我还是更新了。在回答后,我用纯RegExp和lookbehinds/aheads玩了很长时间,但我不能我无法解决这个问题。看起来你的RegExp现在没有为大写字母、数字块和特殊字符预留空格…@Teemu是的,它照样涵盖了OP的示例(参见我发布的第二个regex101链接),但我想有些情况需要额外的规则。但是如果没有详尽的需求列表,很难判断。