需求:取出下面字符串中的“学习”
、“2022”
、“看电影”
、“true”
、“打球”
,“null”
,不能使用JSON.parse
let str = '["学习",2022,"看电影",true,"打球",null,{"hobbyA":123}]'
出这个需求的原因:想自己实现解析json字符串的功能,一开始想的是用正则来匹配,多层对象嵌套的json字符串用正则实现了,但遇到对象里有数组时发现用正则来匹配会误匹配,所以有了这个问题
需求:取出下面字符串中的“学习”
、“2022”
、“看电影”
、“true”
、“打球”
,“null”
,不能使用JSON.parse
let str = '["学习",2022,"看电影",true,"打球",null,{"hobbyA":123}]'
出这个需求的原因:想自己实现解析json字符串的功能,一开始想的是用正则来匹配,多层对象嵌套的json字符串用正则实现了,但遇到对象里有数组时发现用正则来匹配会误匹配,所以有了这个问题
'["学习",2022,"看电影",true,"打球",null,{"hobbyA":123}]'.match(/[^/[].*?,/g).map(s => s.replace(/"|,/g, ''))
这样符合你要求吗
用 split
比全用正则表达式清楚,同意的话请采纳。
let str = '["学习",2022,"看电影",true,"打球",null,{"hobbyA":123}]';
let str1 = str.replace(/{.*?}|\[|\]/g, '');
let arr = str1.split(',');
for (var i = 0; i < arr.length; i++ ) {
if (arr[i]) console.log(arr[i].replace(/"(.+)"/, '$1'));
}
(function($str){
let map = {
'"' : false,
'[]' : 0,
'{}' : 0,
};
let arrMatch = [];
let arr = [];
let filter = function($match){
if(map['"'] === true)
{
arr.push($match);
return true;
}
if(arr.length > 0)
{
arrMatch.push(arr.join(''));
arr = [];
}
return false;
};
$str.replace(/./g, function($match){
switch($match)
{
case '[':
if(filter($match) === false)
map['[]'] ++;
break;
case ']':
if(filter($match) === false)
map['[]'] --;
break;
case '{':
if(filter($match) === false)
map['{}'] ++;
break;
case '}':
if(filter($match) === false)
map['{}'] --;
break;
case ',':
filter($match);
break;
case '"':
map['"'] = !map['"'];
if(map['[]'] === 1 && map['{}'] === 0)
arr.push($match);
break;
default:
if(map['[]'] === 1 && map['{}'] === 0)
{
if($match !== ' ')
arr.push($match);
else if(map['"'] === true)
arr.push($match);
}
break;
}
return $match;
});
console.log(arrMatch);
})('["学习",2022,"看电影",true,"打球", null,{"hobbyA":123},["nest"],"[", "}",false]');
返回结果
['"学习"', '2022', '"看电影"', 'true', '"打球"', 'null', '"["', '"}"', 'false']
如果这是个考题,那考的应该是是基础能力,用状态机解决应该是一个很规范的答案,就是个基本的词法解析嘛,只需要:字符串,数字,保留字(true, null)
用正则的话不好覆盖边界情况
str = '["学习",2022,"看电影",true,"打球",null,{"hobbyA":123}]'
r = /[[,]("([^\"]+)"|(\d+)|null|true)/g
while(m = r.exec(str)) console.log(m[2]||m[1])
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
题主的要求应该是只匹配数组里面的简单项,不能匹配复杂项(对象或者数组)
那思路应该是判断匹配项是不是在复杂项内部
因为复杂项的括号都是成对出现的,所以可以通过记录括号的数量来判断,实现如下