【问题标题】:Struggling with a regex for matching inner quote+parenthesis. Do I need negative/positive look-ahead/behind?努力使用正则表达式匹配内引号+括号。我需要消极/积极的前瞻/后视吗?
【发布时间】:2020-12-07 16:09:08
【问题描述】:

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

  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', 'and', '(wild* or "stratus or kincade")']

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

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

前两个字符串匹配正确。

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

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

...而我想要的是:

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

它匹配第一个内括号,但也抓住了第一个内引号。我一直在用消极和积极的前瞻性调整正则表达式,但我无法弄清楚。

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

【问题讨论】:

  • 我认为我遗漏了一些细微差别,但 /\(.*?\)|".*?"|\w+\*?/g 与您的示例一起使用

标签: javascript regex regex-lookarounds regex-group


【解决方案1】:

您尝试的第一个模式 \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)));

【讨论】:

  • 这很有帮助!谢谢你。在您的帮助下,我确定了这个更新的正则表达式:/[\w'*,]+|\([^()]+\)|"[^"]+"/
  • @Marc 不客气,这对解决问题很有帮助。如果您认为提供的答案有帮助,请随时接受。
【解决方案2】:

如果这 3 个案例是您寻找的唯一刻板印象,您可以试试这个

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

它会寻找

  • 单词 表达式
  • 表达式

在正则表达式中测试它: https://regexr.com/5adgh

[编辑]

对不起,我忘记了捕获组

【讨论】:

  • 我已经更接近这个正则表达式,但我失去了括号:/\w+*?|"(?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多