如何将驼峰字符串转换为句子大小写而不排除任何特殊字符?

问题描述 投票:0回答:4

如何将驼峰字符串转换为句子大小写而不排除任何特殊字符?

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

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 *`

用正则表达式可以吗?

javascript
4个回答
3
投票

您必须亲自处理所有案件:

  • [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


2
投票

想要的结果似乎并不规则,一些特殊字符应该在前面加空格,而有些则不然。按照您想要的方式处理括号有点棘手。您可以使用函数来处理括号,如下所示:

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 使用不同的数据测试片段。


0
投票
  1. 标的房产是拥有 14 年历史的住宅楼,受 BBMP 限制。
  2. 识别:对象财产没有编号,但有界限。通过 EC 法案确定的财产,以及有利于文件持有人的匹配 RR 号码。
  3. 地块面积:根据实际和文件,东西宽 47 英尺,南北宽 30 英尺,1,410 英尺。因此,评估时也考虑同样的情况。
  4. 建筑面积:由于实际BUA为1,976平方英尺(G+1层),并且未提供制裁计划,因此BUA是根据允许的FAR @ 1.75和地面覆盖率75%计算的,BUA为2,115平方英尺(G+1层) 1层)。因此,估值时会考虑最少的 BUA。
  5. 入住状况: GF -1 BHK 2 单位- 租户 FF - 1 BHK(2 单位)- 自己
  6. 引道宽度:30 英尺柏油路
  7. 根据 2015 年 CDP 房产位于住宅主区。
  8. 根据 Dishaank,标的房产位于 SY no.301 提供的文件有
  9. 2023 年 9 月 11 日的 BBMP 财产税收据,受益人为 S A Arif Pasha 和 S A Athik Pasha
  10. 销售契约 6534/17-18,日期为 2018 年 1 月 3 日,受益人为 A Arif Pasha 和 S A Athik Pasha
  11. BBMP 表格 B Katha 日期为 1/02/2018,有利于 A Arif Pasha 和 S A Athik Pasha

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.