我有一个JSON字符串:
x = '{"userId":"foo","traits":{"email":"foo@foobar.com"},"type":"identify"}'
我希望从中获取某些值。我试过正则表达式:
到目前为止我已经
了anonId = x.match(/\"anonymous_id\"\:(.*?)/)?[1]
email = x.match(/\"email\"\:\"(.*?)\"/)?[1]
userId = x.match(/\"userId\"\:\"(.*?)\"/)?[1]
type = x.match(/\"type\"\:\"(.*?)\"/)?[1]
这是丑陋而低效的,但当我尝试将它们组合时:
[_, a, b, c, d] = x.match(/\"anonymous_id\"\:(.*?)|\"userId\"\:(.*?)|\"email\"\:(.*?)|\"type\"\:(.*?)/g)
返回的结果是整个组,而不仅仅是匹配的部分。
我希望a,b,c,d等于键的值,但我得到:
Wanted:
**>> ["foo","foo@foobar.com","identify"]**
Actual results:
>> ["userId":"foo","email":"foo@foobar.com","type":"identify"]
有没有办法在一行正则表达式中实现这一目标?
--- UDPATE ----
我最终选择了
rxp = /\"user_id\"\:\"(.*?)\"|\"anonymous_id\"\:\"(.*?)\"|\"type\"\:\"(.*?)\"/g
anonId = null
userId = null
type = null
while (arr = rxp.exec(bdy)) isnt null
userId = arr[1] if arr[1]
anonId = arr[2] if arr[2]
type = arr[3] if arr[3]
FWIW我避免使用JSON.parse,因为我处理了数以千计的这些,因为我只需要一小部分,我不希望JSON.parse的缓慢影响不必要的服务器。
答案 0 :(得分:2)
try {
var parsed = JSON.parse(x);
anonId = parsed.anonymous_id;
} catch (ex) {
//invalid json
}
除非你有无效的JSON,否则这应该有用。然后你可能想要考虑正则表达式,但即使这样你也可能想要查看模板。
答案 1 :(得分:0)
一次拨打RegExp
/[a-z@.]+(?=",|"})/ig
.match()
var x = '{"userId":"foo","traits":{"email":"foo@foobar.com"},"type":"identify"}';
var res = x.match(/[a-z@.]+(?=",|"})/ig);
console.log(res);