regex - 如何使用正则表达式捕获结果进行后视
问题描述
我正在尝试使用捕获组的结果来查看特定答案。
文本示例:
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) 的结果来执行后视并获得整个答案?
解决方案
您要求的内容是不可能的,因为捕获的值只能在获取后进行检查。
您可以尝试另一种逻辑:捕获答案字母,然后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
。
推荐阅读
- java - 自定义firebase单例类以减少android应用程序开发的代码行
- c - 用数字按升序重新排序数字(带前导零)
- wordpress - Wordpress Mailchimp 插件不会显示成功消息
- java - 获取与 Arraylist 匹配的 List 的 Arraylist 中的数据
- java - 枚举的 values()
- java - 类型列表中的方法add(object) 不适用于参数(int) 是什么意思?
- c - "free(): invalid pointer" error while freeing allocated memory of a hash table
- excel - 如何将表列数据转置为数组,保留数据格式(作为字符串或文本)
- sql - 在 Oracle SQL 中透视多个日期范围
- scala - IntelliJ IDEA - Scala 格式