如何使用正则表达式捕获结果向后看

问题描述 投票:0回答:1

我正在尝试使用捕获组的结果对特定答案进行回溯。

文本示例:

10)一旦制定并实施了战略,无论发生什么事情,公司都必须坚持执行。

答案:FALSE

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

A)模仿市场上最受欢迎的SUV的功能

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

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

D)替换价格较低的组件以保持较低的成本

答案:B

当前输出:

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

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

预期输出

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

当前正则表达式

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

我如何使用第二个捕获组(B)的结果进行向后查找并获得整个答案?

regex regex-negation regex-group
1个回答
0
投票

您要求的结果是不可能的,因为只有在获得捕获的值之后才能检查捕获的值。

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

您可以考虑使用类似的模式

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

请参见regex demo

它现在有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。]]
© www.soinside.com 2019 - 2024. All rights reserved.