正则表达式挣扎以匹配内部引号和括号我是否需要正面/负面的正面/反面?

问题描述

我正在尝试对以下字符串执行正则表达式:

  1. "sonoma wildfires"
  2. sonoma and (wild* or stratus or kincade)
  3. sonoma and (wild or "stratus kincade")

...以便获得以下匹配项:

  1. ['"sonoma wildfires"']
  2. ['sonoma','and','(wild* or stratus or kincade)']
  3. ['sonoma','(wild* or "stratus or kincade")']

我正在使用以下正则表达式:

/\w+\*?|["(][^()"]+[")]/g

前两个字符串正确匹配。

但是使用第三个字符串,我得到了这个匹配项:

['sonoma','(wild* or "','stratus','kincade']

...我想要的是:

['sonoma','(wild* or "stratus or kincade")']

它与第一个内部括号匹配,但也获取了第一个内部引用。我一直在对正则表达式进行正面和负面的微调,但是我很难弄清楚。

/\w+\*?|["(](?<!\()[^()"]+(?!\))[")]/g

解决方法

如果这3种情况是您寻找的唯一刻板印象,可以尝试一下

/(\w+) +(and) +(\(.+\))|(\".+\")/g

它将寻找

  • 单词 表达式
  • 表达式

在regexr中测试它: https://regexr.com/5adgh

[edit]

对不起,我忘了捕获小组了

,

您尝试过的第一个模式\w+\*?|["(][^()"]+[")]无法提供所需的匹配,因为交替的第二部分首先匹配列出的任何字符["(],并且可以匹配( >

然后下一部分[^()"]+与一个或多个出现的任何字符匹配,但所列字符除外。匹配项不会到达右括号,因为它不能与否定字符类中出现的第三个示例中的双引号交叉。


您不需要任何环顾,您可以在轮换中添加第三种选择。

\w+\*?|\([^()]+\)|"[^"]+"

说明

  • \w+\*?匹配1个以上的字符和可选的*
  • |
  • \([^()]+\)使用negated character class
  • 从开括号到右括号之间的匹配
  • |
  • "[^"]+"使用否定的字符类在双引号和双引号之间进行匹配

Regex demo

[
  `sonoma wildfires"`,`sonoma and (wild* or stratus or kincade)`,`sonoma and (wild or "stratus kincade")`,].forEach(s => console.log(s.match(/\w+\*?|\([^()]+\)|"[^"]+"/g)));