You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:37:36