0%

JavaScript用正则表达式分割字符串并返回每个字符串的起始位置

  1. 改进:引号引起来的不受分隔符影响

记录一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const splitStr = (str, regBlock = /[;|;]+\ */) => {
let blocks = [];
let charPos = 0;
while (str) {
let block = str.match(regBlock);
if (!block) {
blocks.push({
substr: str,
startAt: charPos
});
break;
}
let tagStartAt = block.index;
let tagLen = block[0].length;
blocks.push({
substr: str.substring(0, tagStartAt),
startAt: charPos
});
charPos += (tagStartAt + tagLen);
str = str.substring(tagStartAt + tagLen, str.length);
}

return blocks;
};

name 林杉 林四; 年级 2016 ; 班级 16B5的输出:

1
2
3
4
5
[
{ substr: 'name 林杉 林四', startAt: 0 },
{ substr: '年级 2016 ', startAt: 13 },
{ substr: '班级 16B5', startAt: 24 }
]

改进:引号引起来的不受分隔符影响

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
/**
* 分割字符串,引号引起来的不受分隔符影响
* @param {String} str 要分割的字符串
* @param {RegExp} regBlock 分隔符的正则表达式
* @returns {Array} {[substr, startAt]}
*/
const splitStr = (str, seperator) => {
const quoteReg = /[\'|\"|“|‘|”|’]/;
let substr = '';
let substrArr = [];
let inQuote = false;
let i;
for (i = 0, ch = str[i]; i < str.length; i++, ch = str[i]) {
// 如果是引号,则记录开始或结尾
if (quoteReg.test(ch)) {
inQuote = !inQuote;
// 如果引号是结束引号,则将引号前面的字符串提出来
if (!inQuote && substr) {
substr += ch;
continue;
}
}
// 在引号内,连同分隔符全都记录
// 否则,根据分隔符来分割字符串
if (!inQuote && seperator.test(ch)) {
if (substr) {
substrArr.push({
substr,
startAt: i - substr.length
});
substr = '';
}
continue;
}
substr += ch;
}
// 循环结束后,如果substr不为空,说明是最后一段,子字符串
if (substr) {
substrArr.push({ substr, startAt: i - substr.length });
}
return substrArr;
}

调用:

1
2
3
let str = '珞樱缤纷,我的灵魂,“和着节奏,穿梭行走,幻觉爱上这花瓣”,盛开后落无忧;“秋去春来,花落会开;我们何时再回头?” 倘若沦为合照朋友;“一切是曾有”';
console.log(splitStr(str, /[\ |\:|:|\,|,]+/));
console.log(splitStr(str, /[;|;]+\ */));

输出(包含引号):

1
2
3
4
5
6
7
8
9
10
11
12
[
{ substr: '珞樱缤纷', startAt: 0 },
{ substr: '我的灵魂', startAt: 5 },
{ substr: '“和着节奏,穿梭行走,幻觉爱上这花瓣”', startAt: 10 },
{ substr: '盛开后落无忧;“秋去春来,花落会开;我们何时再回头?”', startAt: 30 },
{ substr: '倘若沦为合照朋友;“一切是曾有”', startAt: 58 }
]
[
{ substr: '珞樱缤纷,我的灵魂,“和着节奏,穿梭行走,幻觉爱上这花瓣”,盛开后落无忧', startAt: 0 },
{ substr: '“秋去春来,花落会开;我们何时再回头?” 倘若沦为合照朋友', startAt: 37 },
{ substr: '“一切是曾有”', startAt: 67 }
]