【问题标题】:Java Regular Expression for selection Quzi-Anwsers用于选择测验答案的 Java 正则表达式
【发布时间】:2018-05-03 08:01:54
【问题描述】:

我需要有关 java 正则表达式的帮助。 我想选择一个测验问题的答案。

问题是答案可以通过换行符等跨越几行。我设法选择了最多 2 行的问题,但没有超过几行。

问题示例

问题文本...bla bla bla 呵呵

A.
这是空白文本

B.
那是更多的空白文本

C.
你知道更多
空白文本是

D.
空白文本
空白文本
空白文本

至少有 4 个可能的答案,最多有 6 个。

我做了很多尝试—— 我目前的结果

^[A-G]\.[\s]*^.*$

但只显示字母后的第一行。

^[A-G]\.[\s]*^.*$[\s]+[^. *$]+.* 

但是,这仅适用于多行响应。

使用多行和不使用 Dotall

我想从字母[A-G] 到空白行进行选择。 此外,答案 E 和 G 只能是可选的。

搜索结果:
Matching a Line
Multiline

其他实验是
([A]\..*)([B]\..*)([C]\..*)([D]\..*)
使用 Dotall - 可以很好地解决 4 个问题,但我怎样才能使 E 和 G 可选?

[B]\.[^\n\r]*[\s]*([^\n\r]*\s*[^\n\r]*?\s*[^\n\r]*)?
如果问题有 2 行,就可以工作。显然

有什么想法吗?

@Java 代码

private void getQuestionAnwser(String question) {

        String patternQuestion="^[A-G]\\.[\\s](?:[^\\r\\n]+(?:\\r?\\n|$))*";                
         Pattern pattern = Pattern.compile(patternQuestion,Pattern.MULTILINE);
            Matcher matcher = pattern.matcher(question);
            matcher.matches();
            // check all occurance

            while (matcher.find()) {

                 matcher.start();
                 matcher.end();

                 questionAnwsers.add(matcher.group(0));
                 System.out.println(matcher.group(0));
            }
            String anwser=question.substring(question.indexOf("Answer:"));
            questionAnwsers.add(anwser);

    }

输出:

一个。

B.

C.

D.

【问题讨论】:

    标签: java regex


    【解决方案1】:

    最简单的可能是匹配到第一个空行或输入结束

    ^[A-G]\.[^\n]*\n(?:[^\n]+(?:\n|$))*
    

    处理dos行尾

    ^[A-G]\.[^\r\n]*\r?\n(?:[^\r\n]+(?:\r?\n|$))*
    

    regex101

    【讨论】:

    • 感谢您的回答。看起来我的文本格式错误。不是换行,而是先有一个空格,然后是换行 不幸的是,这在 Java 中似乎不起作用。我使用工具link 进行了测试
    • 在我的帖子中添加了 Java 代码。但是使用 Link 会得到相同的结果。
    • 确实你的问题是.[\s] 可以匹配一个空格或第一个换行符,第一行可以不同的处理:使用* 量词(0 次或更多次,而不是@987654327 @ 1 个或更多),更新答案
    • 就是这样!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多