请帮助我,我是一名正则表达的初学者,我没有找到解决方案。
我有一个这样的字符串:
(name:"apple",color:"red"),(name:"orange",color:"orange"),(name:"berry",color:"red",color:"black")
我想找到所有匹配(名称)和#34;颜色"条件。 例如:
- 颜色为红色,结果是:APPLE和BERRY
- 颜色为ORANGE,结果为:ORANGE
- 颜色是黑色,结果是:BERRY
这是我尝试的方式: 这列出了所有名称(苹果,橙子,浆果):
name:"(.*?)"
这找到两个"条件":
的匹配color:"red"
但如果我尝试像这样结合..
name:"(.*?)color:"red"
..结果是' apple'和'橙",颜色:"橙"),(名称:"浆果",'
谢谢
答案 0 :(得分:2)
如果可能,我建议使用对象而不是字符串作为输入。
但是如果您对输入没有任何控制,一种可能性是首先将其转换为数组数组。然后,您可以使用标准数组操作方法(例如.filter()
和.map()
)来完成它。
var str = '(name:"apple",color:"red"),(name:"orange",color:"yellow"),(name:"berry",color:"red",color:"black")';
// sanitize input
str = '[' +
str.replace(/\(/g, '[')
.replace(/\)/g, ']')
.replace(/[a-z]+:/gi, '') +
']';
// list = [[ 'apple', 'red' ], [ 'orange', 'yellow' ], [ 'berry', 'red', 'black' ]]
var list = JSON.parse(str);
function getFruits(color) {
return list.filter(function(o) {
return o.indexOf(color) > 0;
}).map(function(o) {
return o[0];
});
}
console.log('Red fruits are: ', getFruits("red"));
console.log('Black fruits are: ', getFruits("black"));
以下是getFruits()
的替代版本,使用.reduce()
:
function getFruits(color) {
return list.reduce(function(a, o) {
return o.indexOf(color) > 0 ? a.concat(o[0]) : a
}, []);
}
答案 1 :(得分:0)
试试:
var regex = /\(name:"([^"]+?)"(?:,color:"[^"]*")*(?:,color:"red")(?:,color:"[^"]*")*\)/g;
它甚至可以用于这样的字符串:
(name:"apple",color:"red"),(name:"orange",color:"yellow"),(name:"berry",color:"red",color:"black"),(name:"berry2",color:"black",color:"red",color:"brown")
答案 2 :(得分:-1)
这是一个正则表达式,它查找包含颜色的所有组,但名称必须位于颜色之前
\(name:"([^"]*)"[^\)]*color:"red"[^\)]*\)
http://refiddle.com/refiddles/57a34ab575622d6f2c130000
表示字符串:
(name:"apple",color:"red"),(name:"orange",color:"orange"),(name:"berry",color:"red",color:"black")
您将获得两场比赛,并且该名称在每场比赛的组#1中