Java正则表达式求助:提取跨多行的测验题答案
嘿,这个问题我之前处理测验题文本的时候也踩过坑!要搞定跨多行的选项提取,核心就是让正则能正确识别每个选项的起始和结束边界,同时允许内容里包含换行。
核心思路
每个选项的特征很明确:以A.到F.开头,下一个选项的[A-F].就是当前选项的结束(最后一个选项则到文本末尾)。我们需要用非贪婪匹配+正向预查来精准截取每个选项的内容,再配合Java的DOTALL模式让.能匹配换行符。
具体实现
正则表达式
"([A-F])\\.\\s*(.*?)(?=(?:[A-F]\\.|\\Z))"
拆解一下各部分的作用:
([A-F])\\.:捕获选项的字母(A到F),并匹配后面的英文点号\\s*:匹配点号之后的任意空白(包括空格、换行、制表符)(.*?):非贪婪匹配选项的所有内容(包括换行),直到遇到下一个选项标记或文本结尾(?=(?:[A-F]\\.|\\Z)):正向预查,用来确定选项的结束位置——要么是下一个[A-F].,要么是字符串的末尾(\\Z)
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class QuizOptionExtractor { public static void main(String[] args) { // 模拟包含跨多行选项的测验文本 String quizContent = "问题文本...bla bla bla bla\n" + "A. 这是空白文本\n" + "B. 这是更多空白文本\n" + "C. 你知道还有更多空白文本是\n" + "跨了一行的内容哦\n" + "甚至还能跨第三行\n" + "D. 空白文本空白文本空白文本。\n" + "E. 最后一个选项也可以\n" + "随便换行"; // 启用DOTALL模式,让.匹配换行符;可选CASE_INSENSITIVE支持小写选项字母 Pattern optionPattern = Pattern.compile("([A-F])\\.\\s*(.*?)(?=(?:[A-F]\\.|\\Z))", Pattern.DOTALL); Matcher matcher = optionPattern.matcher(quizContent); // 循环提取所有选项 while (matcher.find()) { String optionLetter = matcher.group(1); // trim()去掉内容首尾的多余空白和换行,让结果更整洁 String optionText = matcher.group(2).trim(); System.out.println(optionLetter + ": " + optionText); } } }
注意事项
- 如果你的测验题选项字母可能是小写(比如
a.),可以在编译Pattern时加上Pattern.CASE_INSENSITIVE参数 - 要是选项文本里意外出现了类似
A.的内容(概率极低,正规测验题不会这么设计),可以再优化正则的边界判断,比如给选项标记加上行首限定(^([A-F])\\.),同时启用Pattern.MULTILINE模式 - 用
trim()处理选项内容是为了去掉换行带来的首尾空白,如果你需要保留原始格式,可以去掉这个调用
内容的提问来源于stack exchange,提问作者P.W
相关产品推荐
相关产品推荐

