Regex 如何将降价代码块与正则表达式匹配?
我试图使用PCRE RegEx从降价文档中提取Regex 如何将降价代码块与正则表达式匹配?,regex,markdown,Regex,Markdown,我试图使用PCRE RegEx从降价文档中提取代码块。对于未初始化的用户,标记中的代码块定义如下: 要在标记中生成代码块,只需缩进 至少用4个空格或1个制表符阻塞。 代码块将一直持续到未缩进的行(或文章末尾) 因此,鉴于本文: This is a code block: I need capturing along with this line This is a code fence below (to be ignored): ``` json This must ha
代码块
。对于未初始化的用户,标记中的代码块定义如下:
要在标记中生成代码块,只需缩进
至少用4个空格或1个制表符阻塞。
代码块将一直持续到未缩进的行(或文章末尾)
因此,鉴于本文:
This is a code block:
I need capturing along with
this line
This is a code fence below (to be ignored):
``` json
This must have three backticks
flanking it
```
I love `inline code` too but don't capture
and one more short code block:
Capture me
到目前为止,我有一个正则表达式:
(?:[ ]{4,}|\t{1,})(.+)
但它只是捕获每行前缀至少有四个空格或一个制表符。它不能捕捉整个街区
我需要的帮助是如何设置条件以捕获4个空格或1个制表符之后的所有内容,直到到达未缩进的行或文本结尾
以下是正在进行的在线工作:
您应该使用字符串的开始/结束标记(
^
和$
与m
修饰符结合使用)。此外,测试文本在最后一个块中只有3个前导空格:
^((?:(?:[ ]{4}|\t).*(\R|$))+)
使用\R
和重复,您可以将整个块与每个匹配匹配,而不是每次匹配一行
请参阅上的演示
免责声明:降价规则比示例文本显示的更复杂。例如,当(嵌套)列表中有代码块时,这些代码块需要以8、12或更多空格作为前缀。正则表达式不适合识别这样的代码块,也不适合识别嵌入在使用更广泛格式组合的标记符号中的其他代码块。试试这个
[a-z]*\n[\s\s]*?\n
它将从你的例子中摘录
This must have three backticks
flanking it
有3种方法可以突出显示代码:1)使用行首缩进;2)使用3个或3个以上的反勾号(包含多行代码块)或3)内联代码。
1和3是的一部分。
以下是实现这一目标的方法。您需要执行3个单独的regexp测试:
(?:\n{2,}|\A) # Starting at beginning of string or with 2 new lines
(?<code_all>
(?:
(?<code_prefix> # Lines must start with a tab or a tab-width of spaces
[ ]{4}
|
\t
)
(?<code_content>.*\n+) # with some content, possibly nothing followed by a new line
)+
)
(?<code_after>
(?=^[ ]{0,4}\S) # Lookahead for non-space at line-start
|
\Z # or end of doc
)
(?:\n{2,}|\A)#从字符串开头开始或以两行新行开始
(?
(?:
(?#行必须以制表符或制表符宽度的空格开头
[ ]{4}
|
\t
)
(?.*\n+)#有一些内容,可能没有内容,后面是新行
)+
)
(?
(?=^[]{0,4}\S)#在行开始处前瞻非空格
|
\Z#或文档结尾
)
(?:\n+\A)?#必须在新行的开头或字符串的开头
(?
(?
[]{0,3}#可能最多有3个前导空格
\`{3,}#3个代码标记(反勾号)或更多
)
\n+
(?*?)#随附内容
\n+
(?\n |\Z)#和新行或字符串结尾
2b)使用带有反勾号的代码块和某些类说明符(扩展标记)
(?:\n+\A)?#必须在一条新线路的开头 (? (? []{0,3}#可能最多有3个前导空格 \`{3,}#3个代码标记(反勾号)或更多 ) [\t]*#可能是一些空格或制表符 (?: (?: (?[\w\-\.]+)\或html、ruby、perl等代码类 (?: [\t]* \{(?[^\}]+)\}类似于{.class#id}的定义块 )?#后面可能是大括号中的类和id定义 ) | (?: [\t]* \{(?[^\}]+)\}类似于{.class#id}的定义块 )#后面是大括号中的类和id定义 ) \n+ (?*?)#随附内容 \n+ (?
)#后面没有反勾号)见他对内联代码使用1个或多个反勾号 (?<!\\) # Ensuring this is not escaped (?<code_all> (?<code_start>\`{1,}) # One or more backtick(s) (?<code_content>.+?) # Code content inbetween back sticks (?<!`) # Not preceded by a backtick \g{code_start} # Balanced closing backtick(s) (?!`) # And not followed by a backtick )
(? (?\`{1,})#一个或多个反勾号 (?.+?)#在背杆之间编码内容 (?
您在正则表达式上设置了哪些选项?如果您想将文本作为块而不是逐行分析,请尝试,其中/regex/m
表示打开“多行”选项。我已尝试在regex101.com上切换m
开关,但这对我当前拥有的正则表达式没有帮助。更新了问题以包含指向我拥有的在线正则表达式的链接。启用多行开关('s'))在regex101.com上,实际上会导致我问题中的正则表达式匹配所有不正确的示例文本…Capture me缩进了3个空格,请参见4个空格。事先尝试的堆栈溢出上的正则表达式问题是世界第八大奇迹!做得好。如果缩进的文本是嵌套在列表项中的段落怎么办?这不正确解释一下。@Waylan,事实上,这并不是为了解释这个问题。处理列表和缩进块组合的规则更复杂,因为前缀空格的数量需要是8、12或与列表缩进级别相对应的任何数字。我怀疑正则表达式是否适合这种情况rsing.@trincot,我同意,这是我的观点。虽然你的解决方案在简单的情况下有效,但它很难是一个完整的解决方案。如果OP想要一个完整的解决方案,那么正则表达式不是答案。我们同意这一点。我在答案中添加了一个免责声明。例如3的模式是错误的-它与模式1相同。复制粘贴错误?是的,复制/粘贴e错误。它应该是:(?(?`{1,})#一个或多个反勾号(?。+)#反勾号之间的代码内容(?)#前面没有反勾号\g{Code\u start}#平衡结束反勾号(?!m
(?:\n+|\A)? # Necessarily at the beginning of a new line (?<code_all> (?<code_start> [ ]{0,3} # Possibly up to 3 leading spaces \`{3,} # 3 code marks (backticks) or more ) [ \t]* # Possibly some spaces or tab (?: (?: (?<code_class>[\w\-\.]+) # or a code class like html, ruby, perl (?: [ \t]* \{(?<code_def>[^\}]+)\} # a definition block like {.class#id} )? # Possibly followed by class and id definition in curly braces ) | (?: [ \t]* \{(?<code_def>[^\}]+)\} # a definition block like {.class#id} ) # Followed by class and id definition in curly braces ) \n+ (?<code_content>.*?) # enclosed content \n+ (?<!`) \g{code_start} # balanced closing block marks (?!`) ) (?:\n|\Z) # and a new line or end of string
(?<!\\) # Ensuring this is not escaped (?<code_all> (?<code_start>\`{1,}) # One or more backtick(s) (?<code_content>.+?) # Code content inbetween back sticks (?<!`) # Not preceded by a backtick \g{code_start} # Balanced closing backtick(s) (?!`) # And not followed by a backtick )