我有一篇包含以下格式的多个问题的文本:
Q1
Question text 1?
1. Answer A
2. Answer B (+1p)
3. Answer C
4. Answer D
Q2
Question Text 2?
1. Answer A (+1p)
2. Answer B
3. Answer C (+1p)
4. Answer D
Q3
Question Text 3
1. Answer A
2. Answer B
3. Answer C (+1p)
正确答案标有 (+1p)。我想重新格式化它,以便在新行中说明正确答案,如下所示:
Q1
Question text 1?
1. Answer A
2. Answer B
3. Answer C
4. Answer D
Answer: B
Q2
Question Text 2?
1. Answer A
2. Answer B
3. Answer C
4. Answer D
Answer: A, C
Q3
Question Text 3
1. Answer A
2. Answer B
3. Answer C
Answer: C
这甚至可以在记事本++中完成吗?
正则表达式的魔力来拯救:
我们需要一个两步走的方法,
-
追加
Answer:
-
查找内容:
(('R'd'.'h+Answer'h+[A-Z]+'h?('('+1p'))?)+)
-
替换为:
'1'r'nAnswer:
- 检查正则表达式 单击"替换"
- 或"全部替换"
-
查找内容:
-
现在我们收集答案:
-
查找内容:
Answer ([A-Z])'h'('+1p')(.*?Answer: [A-Z ]*)
-
替换为:
Answer '1'2'1
- 检查正则表达式
- 选中 匹配换行符
- 单击"替换"或"全部替换"。继续单击,一个块中有多个答案的情况需要与块中的答案一样多的"全部替换"。观察对话框状态栏中的消息。它会告诉你什么时候完成。
-
查找内容:
在第一步中,查找尝试匹配完整的答案块并将其捕获 '1
.替换仅在块后添加一行。
第二步尝试(针对每个块)捕获从第一个(+1p)
到Answer:
的行。发现是这样的,(+1p)
没有被铺平。答案的答案字符在 ''1 中捕获,以下答案直到Answer:
行在 ''2 中捕获,我们将"''1"中的答案字符附加到"答案:"行。(只需做一些查找,看看匹配的内容,然后做一些替换,看看它如何与具有多个标记答案的块一起工作。您可以撤消以重播替换。
有时一个问题会让你在 SO 上感到兴奋(也就是这可以以某种方式完成......
到目前为止,您可能已经得出结论,对于像Notepad++这样的编辑器来说,这并非易事(如果根本不是不可能的话),因此我想到了编程语言的解决方案(在我的情况下PHP
在正则表达式的帮助下),并想在这里介绍它:
解释:
代码基本上是以下步骤:
- 查找问题块 - 这些是以数字和点开头的行块,在每个站点上由空行四舍五入 - 并将其位置保存在原始字符串中。
- 在这些行中,尝试找到标记的答案(模式
(+1p)
) - 创建一个包含可能答案的新字符串
- 需要插入答案字符串(
Answer: ...
)的位置可以通过以下公式计算:
(original offset) + strlen(original string) + strlen(answer_string)
法典:
<?php
$string = 'your original string here';
$regex_questions = '~(?ms)(?:^$'R)(?P<answers>(?:^'d'. Answer [A-E].*?'R)+?)(?:^$'R)(?-ms)~';
# does what is described in point 1.)
preg_match_all($regex_questions, $string, $questions, PREG_OFFSET_CAPTURE);
$regex_answers = '~(?m)^(?:'d'. Answer (?<choice>[A-E]).*?'('+1p'))$~';
# point 2.)
$offset = 0;
# loops over the questions
foreach ($questions["answerswers"] as $question) {
preg_match_all($regex_answers, $question[0], $answers);
$answer = "Answer: " . implode(',', $answers["choice"]) ."'n";
# point 3.)
$position = $offset + $question[1] + strlen($question[0]);
# point 4.)
$string = substr_replace($string, $answer, $position, 0);
$offset += strlen($answer);
}
echo $string;
# After every code block there's a string with the appropiate answers
?>
演示:
在 ideone 上查找在线演示。