两个不同字符串

时间:2015-07-07 08:31:17

标签: javascript regex

我需要编写一个正则表达式,它返回以下两个字符串中的颜色值和大小值。

[{"id":"2","name":"Color","code":"COLOR","optionValue":{"value":"TANGERINE TANGO","priority":0,"altValue1":"ORANGE","altValue2":null}},{"id":"3","name":"Size","code":"SIZE","optionValue":{"value":"MEDIUM","priority":4,"altValue1":null,"altValue2":null}}]

[{"id":"3","name":"Size","code":"SIZE","optionValue":{"value":"MEDIUM","priority":4,"altValue1":null,"altValue2":null}},{"id":"2","name":"Color","code":"COLOR","optionValue":{"value":"PEACOCK BLUE","priority":0,"altValue1":"GREEN","altValue2":null}}]

目前我分别有两个不同的正则表达式。

1) COLOR(?:.*?)value":"([^"]+)(?:.*?)SIZE(?:.*?)value":"([^"]+)"
2) SIZE(?:.*?)value":"([^"]+)(?:.*?)COLOR(?:.*?)value":"([^"]+)"

有没有办法可以使用单个正则表达式实现这一目标?

4 个答案:

答案 0 :(得分:1)

使用JSON.parse,它更安全,更适合使用JSON字符串:

var strings = ['[{"id":"2","name":"Color","code":"COLOR","optionValue":{"value":"TANGERINE TANGO","priority":0,"altValue1":"ORANGE","altValue2":null}},{"id":"3","name":"Size","code":"SIZE","optionValue":{"value":"MEDIUM","priority":4,"altValue1":null,"altValue2":null}}]', '[{"id":"3","name":"Size","code":"SIZE","optionValue":{"value":"MEDIUM","priority":4,"altValue1":null,"altValue2":null}},{"id":"2","name":"Color","code":"COLOR","optionValue":{"value":"PEACOCK BLUE","priority":0,"altValue1":"GREEN","altValue2":null}}]'];

var cnt = 0;
strings.forEach(function(str) {
   var array = JSON.parse(str);
   cnt += 1;
   document.getElementById("r").innerHTML += "<b>Match " + cnt + "</b><br/>";
   array.forEach(function(object) {
     document.getElementById("r").innerHTML += object.optionValue.value + "<br/>";
   });
});
<div id="r"/>

您可以声明一个数组并push将结果输入数组中供以后使用。

答案 1 :(得分:0)

在单个正则表达式中执行此操作的最简洁方法:

(COLOR|SIZE).*?value":"([^"]+).*?(?!\1)(?:COLOR|SIZE).*?value":"([^"]+)"

我可能同意@stribizhev和@Sirko关于解析JSON的问题,但我可以看到你是否只需要完成一个快速而肮脏的工作,然后正则表达式有时是有用的。

说明:

您可以使用更改捕获前瞻断言反向引用

首先,让我们通过删除不必要的非捕获组(?:...)来简化您的正则表达式:

COLOR.*?value":"([^"]+).*?SIZE.*?value":"([^"]+)"
SIZE.*?value":"([^"]+).*?COLOR.*?value":"([^"]+)"

现在,这就是让你半途而废的事情(类似于@ MarcosPerezGude的建议):

(?:COLOR|SIZE).*?value":"([^"]+).*?(?:COLOR|SIZE).*?value":"([^"]+)"
^^^     ^^^^^^                     ^^^^^^^^^    ^

但问题是它接受COLOR COLORSIZE SIZE。以下是解决这个问题的方法:

(  COLOR|SIZE).*?value":"([^"]+).*?(?!\1)(?:COLOR|SIZE).*?value":"([^"]+)"
 ^^                                ^^^^^^

让我解释一下。对于在第一个捕获组中捕获的任何内容,\1反向引用。在我们的情况下,现在COLORSIZE,因为我们已经删除了非捕获性。 (?!\1)否定前瞻声明,表示&#34;只要接下来发生的事情不是\1 ......&#34;因此,如果捕获的字符串为COLOR,则后半部分必须为SIZE,反之亦然。

答案 2 :(得分:-1)

您可以尝试使用OR运算符

 ([size|color](?:.*?))
祝你好运!

答案 3 :(得分:-1)

你应该能够在两个选择之间进行选择:

COLOR(?:.*?)value":"([^"]+)(?:.*?)SIZE(?:.*?)value":"([^"]+)|SIZE(?:.*?)value":"([^"]+)(?:.*?)COLOR(?:.*?)value":"([^"]+)