首页 > 解决方案 > 如何使用正则表达式捕获结果进行后视

问题描述

我正在尝试使用捕获组的结果来查看特定答案。

文本示例:

10) 一旦制定并实施了战略,无论发生什么,公司都必须坚持下去,这一点很重要。

答案:错误

11) 特斯拉需要实施或实现以下哪些策略才能获得竞争优势?

A) 模仿市场上最流行的 SUV 的特点

B) 将利润再投资以制造更好的电动汽车

C) 在汽车的数字显示屏上出售广告空间

D) 替代较便宜的组件以保持低成本

答案:B

电流输出:

https://regex101.com/r/bLKmYX/1

它当前输出 FALSE 和 B 作为这些问题的答案。

预期产出

我希望它输出 FALSE 和B) 将利润再投资以制造更好的电动汽车

当前正则表达式

'^\d+\)\s*([\s\S]*?)\nAnswer:\s*(.*)'

如何使用第二个捕获组 (B) 的结果来执行后视并获得整个答案?

标签: regexregex-negationregex-group

解决方案


您要求的内容是不可能的,因为捕获的值只能在获取后进行检查。

您可以尝试另一种逻辑:捕获答案字母,然后Answer:使用对组值的反向引用匹配子字符串后的相同字母。

你可以考虑这样的模式

(?m)^\d+\)\s*((?:(?:(?!^\d+\))[\s\S])*?\n(([A-Z])\).*)$)?[\s\S]*?)\nAnswer:\s*(\3|FALSE)

请参阅正则表达式演示

它现在有4个捕获组,第一个包含整个题体,第二个包含您需要的答案行,第三个是辅助(用于检查哪个答案是正确的),第四个是答案值。

细节

  • (?m)-^现在匹配行开始位置并$匹配行结束位置
  • ^- 一行的开始
  • \d+- 1+ 位数
  • \)- 一个)字符
  • \s*- 0+ 个空格
  • ((?:(?:(?!^\d+\))[\s\S])*?\n(([A-Z])\).*)$)?[\s\S]*?)- 第 1 组:
    • (?:(?:(?!^\d+\))[\s\S])*?\n(([A-Z])\).*)$)?- 一个可选的非捕获组匹配
      • (?:(?!^\d+\))[\s\S])*?- 任何字符,0 次或多次出现,不以行首开头,1+ 位数字,然后是)序列
      • \n- 换行符
      • (([A-Z])\).*)- 第 2 组:捕获到第 3 组的 ASCII 大写字母,然后)是 char,然后是该行的其余部分 ( .*)
      • $- 行结束
    • [\s\S]*?- 尽可能少的任何 0+ 字符
  • \nAnswer:- 新行,Answer:字符串
  • \s*- 0+ 个空格
  • (\3|FALSE)- 第 4 组:第 3 组值或FALSE

推荐阅读