文本转换:根据上一次出现添加文本

时间:2016-01-18 17:41:19

标签: php regex algorithm notepad++

我的文字包含以下格式的多个问题:

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

这是否可以在Notepad ++中完成?

2 个答案:

答案 0 :(得分:1)

正常表达对救援的魔力:

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

  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
    • 检查正则表达式
    • 检查。匹配换行
    • 点击替换全部替换。继续点击,在一个区块中包含多个答案的案例需要全部替换,因为区块中有答案。观察对话框状态栏中的消息。它会告诉你什么时候完成。
  3. 在第一步中,find尝试匹配完整的答案块并在\1中捕获它。替换在块之后添加一行。

    第二步尝试(对于每个块)捕获从第一个(+1p)Answer:的行。该查询是(+1p) cpatured。答案的答案字符在\ 1中被捕获,以下答案直到在\ 2中捕获Answer:行并且我们追加答案字符 ' \ 1'回答:'线。 (只需做一些发现,看看匹配的内容,然后做一些替换,看看它如何与具有几个标记答案的块一起工作。你可以撤消重播替换。)

答案 1 :(得分:1)

有时候一个问题让你感到震惊(也就是这可以某种方式完成 ...)
截至目前,您可能已经得出结论,对于像Notepad ++这样的编辑器来说这不是一件容易的事(如果不是根本不可能的话),所以我想到了一种编程语言的解决方案(在我的例子中PHP在正则表达式的帮助下)并希望在此处呈现:

说明:

代码基本上做的是以下步骤:

  1. 查找问题块 - 这些是以数字和点开头的行块,每个站点上都有空行 - 并将其位置保存在原始字符串中。
  2. 在这些行中,尝试找到标记的答案(模式(+1p)
  3. 创建一个包含可能答案的新字符串
  4. 需要插入答案字符串(Answer: ...)的位置可以通过以下等式计算:
    (original offset) + strlen(original string) + strlen(answer_string)
  5. 代码:

    <?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["answers"] 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
    ?>
    

    演示:

    找到online demo on ideone