如何解析用冒号分隔的正则表达式名称/值对?

时间:2017-06-15 11:46:21

标签: javascript regex

我有这个字符串(分面搜索查询):

var q = ":salesRevenue:brand:Tchelicon:brand:Eurocom
:brand:Turbosound:brand:Labgruppen:brand:Tannoy:brand:Klarkteknik
:brand:Midas:brand:Bugera
:brand:Tcelectronic
:eligibleProduct:0010000066:publicProduct:false:brand:Behringer:productFilter:All:";

我想将它拆分为三个单独的字符串:q_brand,q_pubs和q_product,我的客户端希望在Regex中使用它。

q_brand包含值前面带有"品牌的值:"仅

q_pubs是前面带有" qualifiedProduct的值:"和" publicProduct:"。

q_product是以" productFilter:"开头的值。

我希望能够捕捉到它们,即使它们交换位置(例如:品牌:Behringer的位置:)

预计最终结果为:

var q_brand = "brand:Tchelicon:brand:Eurocom
:brand:Turbosound:brand:Labgruppen:brand:Tannoy:brand:Klarkteknik
:brand:Midas:brand:Bugera
:brand:Tcelectronic:brand:Behringer";

var q_pubs = "eligibleProduct:0010000066:publicProduct:false";

var q_product = "productFilter:All";

我尝试在(brand:.+:)上使用brand:apple:brand:orange:product:hello:brand:grain:作为一个实例和其他几个实例,但却得到了意想不到的结果。

1 个答案:

答案 0 :(得分:0)

你非常接近 - 你尝试的主要问题是你在比赛中加入了尾随冒号,这会干扰以后的比赛。

一般模式是(foo:[^:]+)/g) - 这将匹配一个字段名" foo",后面跟一个冒号,后跟任何不是冒号的字符大于零的数字,反复。然后将结果连接起来(再次使用冒号)以适合您想要的输出。

对于q_pub你有两个不同的字段名,所以推广到" \ w + Product" (匹配产品后跟任意数量的字母字符。)



var q = ":salesRevenue:brand:Tchelicon:brand:Eurocom:brand:Turbosound:brand:Labgruppen:brand:Tannoy:brand:Klarkteknik:brand:Midas:brand:Bugera:brand:Tcelectronic:eligibleProduct:0010000066:publicProduct:false:brand:Behringer:productFilter:All:";

var q_brands = q.match(/(brand:[^:]+)/g).join(":");
var q_pub = q.match(/(\w+Product:[^:]+)/g).join(":");
var q_products = q.match(/(productFilter:[^:]+)/g).join(":");

console.log(q_brands);
console.log(q_pub);
console.log(q_products);