为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式大写分隔但彼此相邻的分隔不超过 1

正则表达式大写分隔但彼此相邻的分隔不超过 1

慕桂英3389331 2023-04-27 15:23:30
我有一组值,我必须用大写字母分隔它们。但是在某些情况下,数组的值有 2、3 或 4 个连续的大写字母,我不能将它们分开。以下是一些值:ERISACheckL ERISA404cCheckL F401kC  DisclosureG SafeHarborE明确的结果必须是:ERISA Check L   ERISA 404c Check L  F 401k C    Disclosure G    Safe Harbor E我尝试使用:value.match(/[A-Z].*[A-Z]/g).join(" ")但当然它不适用于连续字母。
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

一种选择是匹配 1 个或多个大写字符,断言直接在右边的不是小写字符,或者获取左边是字符 az 或数字,右边是大写字符的位置。

使用拆分并为模式使用捕获组以将其保留在结果中。

([A-Z]+(?![a-z]))|(?<=[\da-z])(?=[A-Z])
  • (捕获组 1(使用 split 保留)

    • [A-Z]+(?![a-z])匹配 1+ 个大写字符,断言直接在右边的是 az

  • )关闭第 1 组

  • |或者

  • (?<=[\da-z])(?=[A-Z])获取紧靠左边的位置是 az 或数字,紧靠右边的位置是 AZ

const pattern = /([A-Z]+(?![a-z]))|(?<=[\da-z])(?=[A-Z])/;

[

  "ERISACheckL",

  "ERISA404cCheckL",

  "F401kC",

  "DisclosureG",

  "SafeHarborE"

].forEach(s => console.log(s.split(pattern).filter(Boolean).join(" ")))

另一种选择是使用匹配不同部分的交替: |

[A-Z]+(?![a-z])|[A-Z][a-z]*|\d+[a-z]+
  • [A-Z]+(?![a-z])匹配 1+ 个大写字符,断言直接在右边的是 az

  • |或者

  • [A-Z][a-z]*匹配 AZ(可选)后跟 az 以匹配单个大写字符

  • |或者

  • \d+[a-z]+匹配 1+ 个数字和 1+ 个字符 az

const pattern = /[A-Z]+(?![a-z])|[A-Z][a-z]*|\d+[a-z]+/g;

[

  "ERISACheckL",

  "ERISA404cCheckL",

  "F401kC",

  "DisclosureG",

  "SafeHarborE"

].forEach(s => console.log(s.match(pattern).join(" ")))


查看完整回答
反对 回复 2023-04-27
?
jeck猫

TA贡献1909条经验 获得超7个赞

function formatString(str) {

  return str.replace(/([A-Z][a-z]+|\d+[a-z]+)/g, ' $1 ').replace('  ', ' ').trim();

}


// test

[

  'ERISACheckL',

  'ERISA404cCheckL',

  'F401kC',

  'DisclosureG',

  'SafeHarborE'

].forEach(item => {

  console.log(formatString(item));

});


查看完整回答
反对 回复 2023-04-27
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信