我需要编写一个正则表达式,它返回以下两个字符串中的颜色值和大小值。
[{"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":"([^"]+)"
有没有办法可以使用单个正则表达式实现这一目标?
答案 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
COLOR
和SIZE
SIZE
。以下是解决这个问题的方法:
( COLOR|SIZE).*?value":"([^"]+).*?(?!\1)(?:COLOR|SIZE).*?value":"([^"]+)"
^^ ^^^^^^
让我解释一下。对于在第一个捕获组中捕获的任何内容,\1
是反向引用。在我们的情况下,现在COLOR
或SIZE
,因为我们已经删除了非捕获性。 (?!\1)
是否定前瞻声明,表示&#34;只要接下来发生的事情不是\1
......&#34;因此,如果捕获的字符串为COLOR
,则后半部分必须为SIZE
,反之亦然。
答案 2 :(得分:-1)
您可以尝试使用OR运算符
([size|color](?:.*?))
祝你好运!
答案 3 :(得分:-1)
你应该能够在两个选择之间进行选择:
COLOR(?:.*?)value":"([^"]+)(?:.*?)SIZE(?:.*?)value":"([^"]+)|SIZE(?:.*?)value":"([^"]+)(?:.*?)COLOR(?:.*?)value":"([^"]+)