ts/js 版本去除文本中空格

文末附上 js 版本,需求简单概括为 去除一段文本中的不可见字符,要求汉字之间无空白,英文之间多个空白合并成一个

注 v1 和 v2 均为 typescript 代码

v1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 删除空格,英文之间空格不删除
*/
function deleteTrim(text: string): string {
// 替换掉两个空格以上的为单个空格
let txtTrim = text.replace(/\s{2,}/g, " ");
// 替换掉换行tab
txtTrim = txtTrim.replace(/[\r\n\t]/g, "");
// 过滤掉除了中文、英文、数字之外的
// txtTrim = txtTrim.replace(/[^\u4e00-\u9fa5\u0030-\u0039\u0061-\u007a\u0041-\u005a]+/g, "")
const strArr = txtTrim.split("");
let lastChinese;
const arrStr = [];
strArr.forEach((char) => {
if (char === " ") {
if (!lastChinese) {
arrStr.push(char);
}
} else {
arrStr.push(char);
}
if (/.*[\u2E80-\u9FFF]+.*$/.test(char)) {
// \u 表示unicode
lastChinese = true;
} else {
lastChinese = false;
}
});
return arrStr.join("");
}

v2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* 删除空格,英文之间空格不删除
* 文字开头不会出现空白字符,文末最多只保留一个空白
* 去掉所有连续的不可见,只保留一个
* 中日韩文字之间不保留任何不可见字符
* 常用不可见字符包括 空格(\u0020) Backspace(\b) 制表符(\t) 换行符(\n) 垂直制表符(\v) 换页符(\f)等15种,详见isBlank方法注释
* 示例
* deleteTrim("  你 好1  hello,\r\n  world!   ") "你好1 hello, world! "
* deleteTrim("你 好") "你好"
* deleteTrim("  你好  ") "你好"
*/
function deleteTrim(text?: string): string | undefined {
if (!text) {
return undefined;
}
let lastChinese = false,
lastBlank = false;
const arrStr = [];
Array.from(text.trim()).forEach((char) => {
if (isBlank(char)) {
if (!lastChinese && !lastBlank) {
arrStr.push(" ");
}
lastBlank = true;
lastChinese = false;
} else {
arrStr.push(char);
lastBlank = false;
if (/[\u2E80-\u9FFF]$/.test(char)) {
// \u 表示unicode
lastChinese = true;
} else {
lastChinese = false;
}
}
});
return arrStr.join("");
}

/**
* 判断字符是否为不可见
* @param s 单个字符
* @returns
*/
function isBlank(s: string): boolean {
if (s.length > 1) {
throw Error("只能传递单字符");
}
switch (s) {
case "\u0020": // 空格
case "\u0008": // \b
case "\u0009": // \t
case "\u000A": // \n
case "\u000B": // \v
case "\u000C": // \f
case "\u000D": // \r
case "\u00A0": // 不换行字符,看上去和空格一样
case "\u2028": // 行分隔符
case "\u2029": // 段落分隔符
case "\uFEFF": // 字节顺序标记
case "\u200E": // 书写标记
case "\u2006": // 另一种编码不同的空格
case "\u200D": //零宽连接符
case "":
return true;
default:
return false;
}
}

JavaScript 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function deleteTrim(text) {
if (!text) {
return undefined;
}
let lastChinese = false,
lastBlank = true;
const arrStr = [];
Array.from(text).forEach((char) => {
if (isBlank(char)) {
if (!lastChinese && !lastBlank) {
arrStr.push(" ");
}
lastBlank = true;
lastChinese = false;
} else {
arrStr.push(char);
lastBlank = false;
if (/[\u2E80-\u9FFF]$/.test(char)) {
// \u 表示unicode
lastChinese = true;
} else {
lastChinese = false;
}
}
});
return arrStr.join("");
}

function isBlank(s) {
if (s.length > 1) {
throw Error("只能传递单字符");
}
switch (s) {
case "\u0020":
case "\u0008": // \b
case "\u0009": // \t
case "\u000A": // \n
case "\u000B": // \v
case "\u000C": // \f
case "\u000D": // \r
case "\u00A0":
case "\u2028":
case "\u2029":
case "\uFEFF":
case "\u200E":
case "\u2006":
case "\u200D":
case "":
return true;
default:
return false;
}
}