2025-01-25 14:47:21 +08:00

197 lines
5.2 KiB
JavaScript

const string = {
// 字符串反转
reverse: function (text) {
return text.split("").reverse().join("");
},
// 字符串替换
replace: function (text, oldStr, newStr) {
return text.replaceAll(oldStr, newStr);
},
// 字符串截取
substring: function (text, start, end) {
return text.substring(start, end);
},
// 去除空白
trim: function (text, mode = "both") {
switch (mode) {
case "start":
return text.trimStart();
case "end":
return text.trimEnd();
default:
return text.trim();
}
},
// 大小写转换
changeCase: function (text, mode = "upper") {
switch (mode) {
case "upper":
return text.toUpperCase();
case "lower":
return text.toLowerCase();
case "capitalize":
return text
.toLowerCase()
.split(" ")
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ");
case "camel":
return text
.toLowerCase()
.split(/[^a-zA-Z0-9]+/)
.map((word, index) =>
index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)
)
.join("");
case "snake":
return text
.toLowerCase()
.replace(/[^a-zA-Z0-9]+/g, "_")
.replace(/([A-Z])/g, "_$1")
.replace(/^_/, "");
case "kebab":
return text
.toLowerCase()
.replace(/[^a-zA-Z0-9]+/g, "-")
.replace(/([A-Z])/g, "-$1")
.replace(/^-/, "");
case "constant":
return text
.toUpperCase()
.replace(/[^A-Z0-9]+/g, "_")
.replace(/^_/, "");
default:
return text;
}
},
// 字符串填充
pad: function (text, length, padString = " ", mode = "end") {
const totalPadding = Math.max(0, length - text.length);
switch (mode) {
case "start":
return text.padStart(length, padString);
case "end":
return text.padEnd(length, padString);
case "both":
const leftPadding = Math.floor(totalPadding / 2);
const rightPadding = totalPadding - leftPadding;
return text
.padStart(text.length + leftPadding, padString)
.padEnd(length, padString);
default:
return text;
}
},
// 字符串分割
split: function (text, separator = ",") {
return text.split(separator);
},
// 数组合并
join: function (array, separator = ",") {
return Array.isArray(array) ? array.join(separator) : String(array);
},
// 字符串重复
repeat: function (text, count = 1) {
return text.repeat(Math.max(0, count));
},
// 提取字符
extract: function (text, mode = "number") {
const patterns = {
number: /\d+/g,
letter: /[a-zA-Z]+/g,
chinese: /[\u4e00-\u9fa5]+/g,
punctuation: /[^\w\s\u4e00-\u9fa5]+/g,
whitespace: /\s+/g,
};
const matches = text.match(patterns[mode] || patterns.number);
return matches ? matches : [];
},
// 字符统计
count: function (text, mode = "char") {
switch (mode) {
case "char":
return text.length;
case "word":
return text.trim().split(/\s+/).length;
case "line":
return text.split(/\r\n|\r|\n/).length;
case "number":
return (text.match(/\d/g) || []).length;
case "letter":
return (text.match(/[a-zA-Z]/g) || []).length;
case "chinese":
return (text.match(/[\u4e00-\u9fa5]/g) || []).length;
case "whitespace":
return (text.match(/\s/g) || []).length;
default:
return 0;
}
},
// 文本换行
wrap: function (text, width = 80) {
const words = text.split(/(\s+)/);
let line = "";
let result = "";
for (const word of words) {
if (line.length + word.length > width) {
result += line.trimEnd() + "\n";
line = "";
}
line += word;
}
return result + line.trimEnd();
},
// 文本对齐
align: function (text, mode = "left", width = 80) {
const lines = text.split("\n");
return lines
.map((line) => {
const spaces = width - line.length;
if (spaces <= 0) return line;
switch (mode) {
case "right":
return " ".repeat(spaces) + line;
case "center":
const leftSpaces = Math.floor(spaces / 2);
return (
" ".repeat(leftSpaces) + line + " ".repeat(spaces - leftSpaces)
);
case "justify":
if (line.trim() === "") return line;
const words = line.trim().split(/\s+/);
if (words.length === 1) return line;
const totalSpaces = width - words.join("").length;
const spaceBetween = Math.floor(totalSpaces / (words.length - 1));
const extraSpaces = totalSpaces % (words.length - 1);
return words
.map((word, i) =>
i < words.length - 1
? word + " ".repeat(spaceBetween + (i < extraSpaces ? 1 : 0))
: word
)
.join("");
default:
return line;
}
})
.join("\n");
},
};
module.exports = string;