给出一个像"['chad', 123, ['tankie'], '!!!']"
这样的字符串,我需要返回一个布尔值,说明该字符串是否为有效数组。
对大多数解决方案(包括正则表达式)开放。
答案 0 :(得分:3)
如果需要支持“任何”字符串,则可以使用new Function()
作为eval()
的更安全的选择。 [source]
function stringIsArray(str) {
try {
return new Function(`return Array.isArray(${str})`)();
} catch {
return false;
}
}
console.log(stringIsArray("abc"));
console.log(stringIsArray("['chad', 123, ['tankie'], '!!!']"));
答案 1 :(得分:3)
假设您要支持Javascript语法的某些子集,则可以使用正则表达式删除空格和标量文字,然后检查其余内容是否与嵌套模式[,[,,,],,,]
相匹配。
let remove = [
/\s+/g,
/'(\\.|[^'])*'/g,
/"(\\.|[^"])*"/g,
/\d+/g,
];
let emptyArray = /\[,*\]/g;
function stringIsArray(str) {
for (let r of remove)
str = str.replace(r, '');
if (str[0] !== '[')
return false;
while (str.match(emptyArray))
str = str.replace(emptyArray, '');
return str.length === 0;
}
console.log(stringIsArray("'abc'"));
console.log(stringIsArray(`['abc', ['def', [123, 456], 'ghi',,],,]`));
console.log(stringIsArray(String.raw`
['a"b"c', ["d'e'f",
[123, [[ [[["[[[5]]]"]]]]], 456], '\"\'""""',,],,]
`));
如果您希望支持 all 所有Javascript语法(例如,包含包含数组的对象的数组等),则需要一个真正的解析器。我编写了一个名为litr的模块,该模块正是这样做的-计算javascript文字,所有这些文字:
const litr = require('litr'); // or <script src=litr.js>
myJsObject = litr.parse(myString);
console.log('is Array?', Array.isArray(myJsObject))
基本上,它是PEG.js JavaScript语法的瘦包装。
答案 2 :(得分:1)
let strtotest = "['chad', 123, ['tankie'], '!!!']"
Array.isArray(eval(strtotest))
如果数组有效,则返回true。 如果字符串中的语法不正确,也会引发错误,因此您也必须处理该错误。
我想指出 eval
是您不应该使用的可怕的东西,但是由于这个问题的要求太疯狂了,我认为此解决方案很合适
答案 3 :(得分:0)
您不应使用eval(出于明显的代码注入原因)。当然,我将解析为JSON与数组是不一样的,但是它是不使用eval()
而获得的最接近的数组。
您可以使用JSON.parse
方法。唯一的缺点是,由于JSON的限制,所有字符串都必须用双引号("
)分隔。
使用nodejs解释器的简单示例:
> var arrayString = '["chad", 123, ["tankie"], "!!!"]';
undefined
> JSON.parse(arrayString);
[ 'chad', 123, [ 'tankie' ], '!!!' ]
> var notArrayString = 'asdas!asd1{}1239]1[';
undefined
> JSON.parse(notArrayString);
Thrown:
SyntaxError: Unexpected token a in JSON at position 0
>
然后可以使用Array.isArray
方法检查它是否为数组。
function stringIsArray(str) {
try {
return Array.isArray(JSON.parse(str));
} catch (e) {
return false;
}
}
stringIsArray('["chad", 123, ["tankie"], "!!!"]'); // returns true
stringIsArray('something else, not an array'); // returns false
如果您不在乎引号,则可以添加str.replace('\'', '"')
。
答案 4 :(得分:0)
也许对其他人有用,您也可以这样做,并且只需要几行。如果您在“ a”中定义要分析的字符串
a = "['chad', 123, ['tankie'], '!!!']";
Array.isArray( JSON.parse( a.replace(/'/g,'"') ) );
这将返回true或false