我是正则表达式的新手,我无法通过谷歌搜索弄清楚如何让它工作。我认为我的部分问题可能是我无法用搜索词来表述问题。
这是我的问题:
我有一个看起来像这样的字符串:
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 中。
解释
\(
匹配左括号([^)]+
使用否定 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/