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));
});
添加回答
舉報