首页 > 解决方案 > 正则表达式大写分隔但彼此相邻的分隔不超过 1

问题描述

我有一组值,我必须用它们的大写来分隔。但是在某些情况下,数组的值有 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(" ")

但当然,它不适用于连载信件。

标签: javascripthtmlregex

解决方案


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

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

([A-Z]+(?![a-z]))|(?<=[\da-z])(?=[A-Z])
  • (捕获组 1(使用拆分保留)
    • [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(" ")))


推荐阅读