如何使用正则表达式捕获结果进行回顾

How To Use a Regex Capture Result to Lookbehind

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

文本示例:

10) Once a strategy has been formulated and implemented, it is important that the firm sticks to it no matter what happens.

Answer: FALSE

11) Which of the following strategies does Tesla need to implement or achieve to gain a competitive advantage?

A) imitate the features of the most popular SUVs on the market

B) reinvest profits to build successively better electric automobiles

C) sell advertising space on their cars' digital displays

D) substitute less-expensive components to keep costs low

Answer: B

当前输出:

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

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

预期输出

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

当前正则表达式

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

我如何使用第二个捕获组 (B) 的结果执行回顾并获得完整答案?

您所要求的是不可能的,因为捕获的值只能在获取后才能检查。

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

您可以考虑这样的模式

(?m)^\d+\)\s*((?:(?:(?!^\d+\))[\s\S])*?\n(([A-Z])\).*)$)?[\s\S]*?)\nAnswer:\s*(|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 大写字母,然后是 ) 字符,然后是该行的其余部分 (.*)
      • $ - 行尾
    • [\s\S]*? - 任何 0+ 个字符尽可能少
  • \nAnswer: - 换行,Answer: 字符串
  • \s* - 0+ 个空格
  • (|FALSE) - 第 4 组:第 3 组值或 FALSE.