文本转换:根据先前出现的情况添加文本


Text transformation: Adding text according to previous occurrence

我有一篇包含以下格式的多个问题的文本:

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

这甚至可以在记事本++中完成吗?

正则表达式的魔力来拯救:

我们需要一个两步走的方法,

  1. 追加Answer:

    • 查找内容: (('R'd'.'h+Answer'h+[A-Z]+'h?('('+1p'))?)+)
    • 替换为:'1'r'nAnswer:
    • 检查正则表达式
    • 单击"替换"
    • "全部替换"
  2. 现在我们收集答案:

    • 查找内容: Answer ([A-Z])'h'('+1p')(.*?Answer: [A-Z ]*)
    • 替换为:Answer '1'2'1
    • 检查正则表达式
    • 选中 匹配换行符
    • 单击"替换"或"全部替换"。继续单击,一个块中有多个答案的情况需要与块中的答案一样多的"全部替换"。观察对话框状态栏中的消息。它会告诉你什么时候完成。

在第一步中,查找尝试匹配完整的答案块并将其捕获 '1 .替换仅在块后添加一行。

第二步尝试(针对每个块)捕获从第一个(+1p)Answer:的行。发现是这样的,(+1p)没有被铺平。答案的答案字符在 ''1 中捕获,以下答案直到Answer:行在 ''2 中捕获,我们将"''1"中的答案字符附加到"答案:"行。(只需做一些查找,看看匹配的内容,然后做一些替换,看看它如何与具有多个标记答案的块一起工作。您可以撤消以重播替换。

有时一个问题会让你在 SO 上感到兴奋(也就是这可以以某种方式完成......
到目前为止,您可能已经得出结论,对于像Notepad++这样的编辑器来说,这并非易事(如果根本不是不可能的话),因此我想到了编程语言的解决方案(在我的情况下PHP在正则表达式的帮助下),并想在这里介绍它:

解释:

代码基本上是以下步骤:

  1. 查找问题块 - 这些是以数字和点开头的行块,在每个站点上由空行四舍五入 - 并将其位置保存在原始字符串中。
  2. 在这些行中,尝试找到标记的答案(模式(+1p)
  3. 创建一个包含可能答案的新字符串
  4. 需要插入答案字符串(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 上查找在线演示。

相关文章: