regex 修改正则表达式来捕获问题和答案,以包含换行符

ffscu2ro  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(130)

我在我使用的Obsidian-to-Anki插件工具中有以下正则表达式,取自他们的Wiki:

^Q: ((?:.+\n)*)\n*A: (.+(?:\n(?:^.{1,3}$|^.{4}(?<!<!--).*))*)

字符串
Source:Question answer style · Pseudonium/Obsidian_to_Anki Wiki https://github.com/Pseudonium/Obsidian_to_Anki/wiki/Question-answer-style
目前,基于我对regex的有限知识,我是这样解释这个regex的:

  1. Question在新的一行以Q:开始,表示Question的开始。它从下一个位置开始捕获,直到看到答案的开始
  2. Answer在一个新的行上以A:开始-当它看到一个换行符或一个HTML注解时,它会停止捕获。
    1.我真的不明白检查包含^.{1,3}$的行-我不明白这是在做什么。
    因此,根据以下注解,它与问题和答案正确匹配。
    但是,我想对这个正则表达式做两个修改:
    1.我希望在问题和答案中都允许空行-我经常在问题和答案中放入代码。当代码中出现空行时,问题或答案将被截断
    1.每个问答部分总是以新行---结束。我想把答案一直捕捉到这一行。
    下面是我在regex 101站点上进行的实验。我得到了一些工作的问题提取,但对于答案,我不能使它的工作,因为这部分对我来说太复杂了-任何帮助将不胜感激。https://regex101.com/r/s15yb9/1
    这里是我的笔记摘录-前两个问题已经在Anki中,因此它们有一个ID。最后一个问题是新的。
    问:null和undefined有什么区别?
    A:Null表示故意的空值。
  • Undefined表示完全没有值。这发生在只有变量被声明而没有任何初始化器的情况下。对象中缺少的键也是未定义的。
export function ticketStatus(tickets, ticketId) {
  if (tickets[ticketId] === undefined) {
    return 'unknown ticket id';
  } else if (tickets[ticketId] === null) {
    return 'not sold';
  } else {
    return `sold to ${tickets[ticketId]}`;
  }
}


Q:重写以使用JS Object.assign

visitor.ticketId = null;
return visitor;


A:只传递我们想要覆盖的props来赋值

return Object.assign(visitor, {ticketId: null});


问:isNaN()global与Number之间的差异。isNaN()?
A:global isNaN()执行类型转换。

  • 由于我试图测试字符串是否包含有效的数字,因此这是正确的选择。
  • 如果输入已经是一个数字,那么Number.isNaN()可能更好。作为
ruoxqz4g

ruoxqz4g1#

我正在使用Neuracache闪存卡风格,我遇到了同样的问题:
我想出了这个,也许有人能找到更好的办法来做:

(?:<!---->\n)+([\s\S]*?) #flashcard ?\n*((?:\n(?:(?:```(?:[\s\S]*?)```)|^.{1,3}$|^.{4}(?<!<!--).*))+)

empty lines can be anywhere in question
empty lines can be in ``` ``` tags in Answer
HTML tags are allowed
give a empty line after an answer

字符串
空行是允许的,我认为有一些小的警告,希望这有助于修改其他风格

<!---->
Empty lines allowed anywhere in the question

End of Question #flashcard
Answer Starts on the next line or after any number of empty lines 

import python

Empty lines allowed only within the tags ``` in answer

answer ends when you give a empty line after this and outside ```

<!---->
Next question starts in the same format as above after an empty line


每个问题都应该以<!---->开头,后跟一个换行符:

(?:<!---->\n)+           # Match one or more occurrences of `<!---->` followed by a newline
([\s\S]*?)               # Group 1 Capture any characters (including newlines) till the word ' #flashcard' is seen
#flashcard ?             # Match the string `#flashcard`, optionally followed by a space
\n*                      # Match zero or more newline characters
(                        # Group 2
  (?:                    # Start of a non-capturing group
    \n                   # Match a newline character
    (?:
      (?:```(?:[\s\S]*?)```)|         # Match a code block enclosed in triple backticks
      ^.{1,3}$|                        # Match a line with 1 to 3 characters (excluding newlines)
      ^.{4}(?<!<!--).*                 # Match a line with at least 4 characters (excluding newlines), excluding lines starting with `<!--`
    )
  )+                     # End of the non-capturing group, match one or more occurrences
)


两个捕获组组1和组2匹配答案和问题。#flashcard后允许有零个或一个空格

相关问题