正则表达式 - 查找带条件的字符串中的所有匹配项(javascript)

时间:2016-08-04 13:53:00

标签: javascript regex

请帮助我,我是一名正则表达的初学者,我没有找到解决方案。

我有一个这样的字符串:

(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'和'橙",颜色:"橙"),(名称:"浆果",'

谢谢

3 个答案:

答案 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;

请参阅BinaryMessageEncoding

它甚至可以用于这样的字符串:

(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中