繁体   English   中英

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

[英]Regex - find all matches in a string with conditions (javascript)

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

我有一个像这样的字符串:

(name:"apple",color:"red"),(name:"orange",color:"orange"),(name:"berry",color:"red",color:"black")

我想找到所有带有“颜色”条件的匹配项(名称)。 例如:

  • 颜色是红色,结果是:APPLE和BERRY
  • 颜色是橙色,结果是:橙色
  • 颜色是黑色,结果是:BERRY

这是我尝试的方式:这列出了所有名称(苹果,橘子,浆果):

name:"(.*?)"

找到两个“条件”的匹配项:

color:"red"

但是,如果我尝试这样合并。

name:"(.*?)color:"red"

..结果是'apple'和'orange',color:“ orange”),(name:“ berry”,'

谢谢

如果可能的话,我建议使用对象而不是字符串作为输入。

但是,如果您对输入没有任何控制,则一种可能是首先将其转换为数组数组。 然后,您可以使用标准的数组操作方法(例如.filter().map() .filter()

 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(/[az]+:/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
  }, []);
}

试试看:

var regex = /\(name:"([^"]+?)"(?:,color:"[^"]*")*(?:,color:"red")(?:,color:"[^"]*")*\)/g;

参见https://regex101.com/r/hE5zQ8/4

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

(name:"apple",color:"red"),(name:"orange",color:"yellow"),(name:"berry",color:"red",color:"black"),(name:"berry2",color:"black",color:"red",color:"brown")

这是一个查找包含颜色的所有组的正则表达式,但是名称必须在颜色之前

\(name:"([^"]*)"[^\)]*color:"red"[^\)]*\)

http://refiddle.com/refiddles/57a34ab575622d6f2c130000

对于字符串:

(name:"apple",color:"red"),(name:"orange",color:"orange"),(name:"berry",color:"red",color:"black")

您将获得两个匹配项,并且该名称位于每个匹配项的#1组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM