Regex -在一个字符串中查找所有匹配项(JavaScript)

vxbzzdmp  于 2023-05-08  发布在  Java
关注(0)|答案(3)|浏览(137)

请帮助我,我是一个正则表达式的初学者,我没有找到一个解决方案。
我有一个这样的字符串:

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

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

  • 颜色为红色,则结果为:苹果和浆果
  • 颜色为橙子,结果为:橙子
  • 颜色为黑色,则结果为:浆果

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

name:"(.*?)"

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

color:"red"

但是如果我试着像这样合并..

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

。。结果是‘苹果’和‘橙子’,颜色:“橘子”),(名称:“浆果”,‘
谢谢

hsvhsicv

hsvhsicv1#

如果可能的话,我建议使用对象而不是字符串作为输入。
但是如果你对输入没有任何控制,一种可能性是首先将其转换为数组的数组。然后,您可以使用标准的数组操作方法(如.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
  }, []);
}
db2dz4w8

db2dz4w82#

试试这个:

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")
r7xajy2e

r7xajy2e3#

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

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

对于字符串:

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

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

相关问题