检查JSON LIKE字符串是否有效- JS正则表达式
Check if JSON LIKE string is valid - JS regex
我有CLI应用程序,用户提供JSON。我需要检查JSON是否有效。我发现这样的东西可能会很好:
function isJsonValid(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
但是当我调试我的应用程序时,我注意到有一个小问题,所有"
和'
和spaces
从命令被剥夺。所以json为:
{
"key1": "value1",
"key2": "value2"
}
被改成:
{key1:value1,key2:value2}
我需要一个正则表达式,它将检查这个剥离的JSON是否有效。
所以结果应该看起来像:
re.test({key1:value1,key2:value2}) // true
re.test({key1:value1}) // true
re.test({key1:value1,}) // false, extra comma
re.test({key1:value1, key2}) // false, missing value of key2
re.test({key1:value1, key2:value2) // false, missing closing }
re.test({key1:value1, key2:value2}}) // false, extra closing }
有人可以帮助我与正则表达式部分?可惜这不是我的强项。
这里有一个正则表达式:
^{(([a-zA-Z0-9]+:[a-zA-Z0-9]+)(,[a-zA-Z0-9]+:[a-zA-Z0-9]+)*)?}$
查看您的示例在这里Regex101.com
正如我在上面的评论中提到的,"剥离"的JSON当然不再是JSON了。您已经确认您不需要担心嵌套的对象或数组,只需一个用花括号括起来的key:value
对的简单列表。
因此,下面的正则表达式假设每个键和值都由"word"字符组成,使用等价于[A-Za-z0-9_]
的正则表达式'w
:
var re = /^'{'w+:'w+(,'w+:'w+)*'}$/;
显然,如果你想改变哪些字符被允许作为键名和值,你可以用[A-Za-z0-9_]
替换每个'w
,并根据需要添加或删除允许的字符。
编辑:在评论中你提到允许在键名和值中使用.
。所以在regex上使用不区分大小写的i
标志:
var re = /^'{[A-Z0-9._]+:[A-Z0-9._]+(,[A-Z0-9._]+:[A-Z0-9._]+)*'}$/i;
但是您可能希望允许所有部分之间有可选的空白,所以我建议在所有令牌之间添加's*
:
var re = /^'s*'{'s*[A-Z0-9._]+'s*:'s*[A-Z0-9._]+'s*(,'s*[A-Z0-9._]+'s*:'s*[A-Z0-9._]+'s*)*'}'s*$/i;
console.log( re.test('{key1:value1,key2:value2}') ) // true
console.log( re.test('{key1:value1}') ) // true
console.log( re.test(' { key1 : value1 , key2 : value2 , k3 : v3 } ') ) // true
console.log( re.test(' { k.j.m : v.a2 , k2.a.b : v.32 , k3 : v3 } ') ) // true
console.log( re.test('{key1:value1,}') ) // false, extra comma
console.log( re.test('{key1:value1, key2}') ) // false, missing value of key2
console.log( re.test('{key1:value1, key2:value2') ) // false, missing closing }
console.log( re.test('{key1:value1, key2:value2}}') ) // false, extra closing }
(请注意,我在名称中编辑的允许.
的位将允许多个.
字符在一行中,但我真的不想继续回来更新我的答案,因为添加了更多的要求,在原始帖子中没有提到。如果你想保持它严格一个.
在一行中,没有前导或尾随点,那么只需应用相同的原则,上面的regex用于使逗号工作
相关文章:
- JS正则表达式跳过每隔一个匹配
- JS 正则表达式以匹配 HTML 标记中不是 的字符串
- 使用 JS 正则表达式添加到字符串(作为数字)
- node.js正则表达式提取出现次数
- JS正则表达式替换编号
- JS正则表达式匹配单词,包括用空格括起来的单词
- angular.js正则表达式示例?如何使用angular.forEach
- 我是妄想,还是 JS 正则表达式支持可选的重复边界
- 用于匹配重复子字符串的单个 js 正则表达式
- JS 正则表达式:替换字符串中的所有数字
- 将函数调用与 JS 正则表达式匹配
- JS - 正则表达式替换在一次调用中发生多次,如何让它运行一次
- 帆.js正则表达式路线
- 节点.js正则表达式不起作用
- JS正则表达式,基本展望
- JS 正则表达式以匹配字符串,令牌之间最多有 1 个空格
- JS 正则表达式 - 允许双连字符
- js 正则表达式替换第一部分
- js 正则表达式不匹配单词边界
- JS正则表达式结果表达式赋值问题