javascript - 如何找到给定搜索词周围括号内的所有内容?

标签 javascript regex

我是正则表达式的新手,我无法通过谷歌搜索弄清楚如何让它工作。我认为我的部分问题可能是我无法用搜索词来表述问题。

这是我的问题:

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

OSDfhosjdjakjdnvkjndkfvjelkrjejrijrvrvrjvnkrjvnkn(mint (light) green pants)shdbfhsbdhfbsjd(couch)hvbjshdbvjhsbdfbjs(forest (dark) (stained) green shirt) sjdfjsdhfjshkdfjskdjfksjdfhfskdjf(table)

我想选择包含单词“green”的括号中的全部内容,并且这些括号。也就是说,我想返回“薄荷(浅)绿裤子”和“森林(深)(染色)绿衬衫”,但“沙发”、“ table ”或任何胡言乱语。

到目前为止我尝试了什么:

  • /(.*?green.*?/) 似乎返回围绕“green”并以/开头和结尾的几乎任意文本 block ,这让我觉得我搞砸了以某种方式转义括号。

  • /(.*green.*/) 似乎返回了整个文档。

  • 用谷歌搜索问题:从我在这里和在 google 上找到的页面似乎我想要的是一个回顾,一个 JavaScript 的正则表达式功能不支持。不幸的是,我在 JS 工作,所以我需要一种方法来完成这项工作。

已编辑:我刚刚意识到我想要输出的文本包含的括号比我最初意识到的要多,并编辑了我的示例以反射(reflect)这一点。

最佳答案

您可以使用捕获组来代替前瞻。首先匹配左括号 \(,然后在捕获组 ( 中匹配所有直到右括号 \)

您的值将在捕获组 1 中。

\(([^)]+\bgreen\b[^)]+)\)

解释

  • \( 匹配左括号
  • ([^)]+ 使用否定 character class 不匹配 )
  • \bgreen\b 使用单词边界匹配单词 green 以确保它不是更大匹配的一部分
  • [^)]+ 匹配一次或多次不是)
  • ) 关闭捕获组
  • \) 匹配 )

const regex = /\(([^)]+\bgreen\b[^)]+)\)/g;
const str = `OSDfhosjdjakjdnvkjndkfvjelkrjejrijrvrvrjvnkrjvnkn(mint green pants)shdbfhsbdhfbsjd(couch)hvbjshdbvjhsbdfbjs(forest green shirt) sjdfjsdhfjshkdfjskdjfksjdfhfskdjf(table)`;
let m;
while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1]);
}

编辑

要匹配 green 之前的平衡括号,您可以不匹配右括号一次或多次,或者使用非捕获组 (?: 和一个匹配平衡括号alternation (?:[^\)]+|\([^)]+\):

\(((?:[^\)]+|\([^)]+\))*\bgreen\b[^)]+)\)

const regex = /\(((?:[^\)]+|\([^)]+\))*\bgreen\b[^)]+)\)/g;
const str = `OSDfhosjdjakjdnvkjndkfvjelkrjejrijrvrvrjvnkrjvnkn(mint (light) green pants)shdbfhsbdhfbsjd(couch)hvbjshdbvjhsbdfbjs(forest (dark) (stained) green shirt) sjdfjsdhfjshkdfjskdjfksjdfhfskdjf(table)`;
let m;
while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1]);
}

关于javascript - 如何找到给定搜索词周围括号内的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50587553/

相关文章:

javascript - 为什么我不能在 ajax 成功中访问 $(this)

javascript - 在 JS 中使用扩展来扩展对象

javascript - RegExp 匹配返回整个单词而不是组

jQuery 执行正则表达式多个选项

python - 如何克服 python 中的正则表达式深度限制?

javascript - React-Native StackNavigator

javascript - React.js 服务器端渲染与 PHP

javascript - 使用 JQuery 获取 SELECT 的选定选项文本

regex - MSBuild 4.0 正则表达式解析

iOS 电子邮件地址验证不接受 .in