2 回答
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(" ")))
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));
});
添加回答
举报