首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不排除任何特殊字符的情况下将驼峰大小写字符串转换为大小写句子?

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

Stack Overflow用户
提问于 2020-07-04 17:09:58
回答 3查看 128关注 0票数 5

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

建议使用正则表达式将具有特殊字符和数字的驼峰大小写字符串转换为大小写:

代码语言:javascript
复制
const string = `includes:SummaryFromDetailHistory1990-AsAbstract`

预期结果:

代码语言:javascript
复制
Includes : Summary From Detail History 1990 - As Abstract

目前,我正在使用lodash startCase将camelCased转换为sentenceCase。但这种方法的问题是,它删除了特殊字符,如括号、数字、括号、连字符、冒号等。(大多数特殊字符)

因此,我们的想法是将驼峰大小写的字符串转换为句子大小写的字符串,同时保留字符串的身份

例如:

代码语言:javascript
复制
const anotherString = `thisIsA100CharactersLong:SampleStringContaining-SpecialChar(s)10&20*`

const expectedReturn = `This Is A 100 Characters : Long Sample String Containing - Special Char(s) 10 & 20 *`

使用正则表达式可以吗?

EN

回答 3

Stack Overflow用户

发布于 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
  • etc.

,但也可以使用\w\W,因此直到you)

  • [^a-zA-Z0-9](?=[a-zA-Z0-9]):既不是字母也不是数字,后面既不是字母也不是数字digit

  • etc.

然后,您可以将它们放在一起:

代码语言:javascript
复制
([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]))

并替换为:

代码语言:javascript
复制
$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在一起:

代码语言:javascript
复制
(?<=[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

票数 3
EN

Stack Overflow用户

发布于 2020-07-04 18:08:06

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

代码语言:javascript
复制
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上使用不同的数据测试代码片段。

票数 2
EN

Stack Overflow用户

发布于 2020-07-04 17:44:19

这是不可能的。您不能在正则表达式中执行此操作。你将不得不考虑例外情况...

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62727314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档