如何确定字符串是否为数组?

时间:2019-11-15 20:00:45

标签: javascript arrays regex string typescript

给出一个像"['chad', 123, ['tankie'], '!!!']"这样的字符串,我需要返回一个布尔值,说明该字符串是否为有效数组。

对大多数解决方案(包括正则表达式)开放。

5 个答案:

答案 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