Markdown、Markdown Extra の正規表現一覧

  • 71
    Like
  • 1
    Comment
More than 1 year has passed since last update.

意外と、まとまったページがなかったので、メモとして記事にしておきます。

僕はWindowsソフトでMarkdown記法に対応したテキストエディタ、

MarkDown#Editor
http://hibara.org/software/markdownsharpeditor

GitHub_icon.png https://github.com/hibara/MarkDownSharpEditor

を、C#のオープンソースで公開しておりますが、その中で、エディター部分のシンタックスハイライターは、正規表現を使って実装しています。

以下は、その抜粋となります。なにか他のソフトへの組み込みや転用の際に、ご参考にしていただければと思います。また誤りや、「こうした方がすっきりする」などあれば、フィードバックいただけるとうれしいです。

Markdown記法とは?

まずは一応、おさらい。
ご存じない方は、以下のサイトなどが参考になるかと思います。

Markdown - Wikipedia
http://ja.wikipedia.org/wiki/Markdown

本家(考えた人)のサイト
http://daringfireball.net/projects/markdown/

Markdown Extra は、別の人が、Markdownを独自に拡張しPHP用ライブラリにしています。
http://michelf.ca/projects/php-markdown/extra/

ちなみに、拙訳ですが、僕のサイトにその全訳があります。
PHP Markdown Extra 仕様の全訳(意訳)
http://hibara.org/blog/2013/03/11/php-markdown-extra-jp/

Markdown の正規表現

強制ブレーク ( Line break )


\s\s$

見出し1 ( Header 1 )


^#[^#]*?$"

および、


^.*\n=+$

見出し2 ( Header 2 )


^##[^#]*?$"

および、


^.*\n-+$

見出し3 ( Header 3 )


^###[^#]*?$

見出し4 ( Header 4 )


^####[^#]*?$

見出し5 ( Header 5 )


"^#####[^#]*?$

見出し6 ( Header 6 )


^#####[^#]*?$

引用 ( Brockquote )


^>.*$

リスト ( Lists )


^ {0,3}\*[ \t]+.*$|^ {0,3}\+[ \t]+.*$|^ {0,3}-[ \t]+.*$|^ {0,3}[0-9]+\.[ \t]+.*$

コードブロック ( Code blocks )


^ {4,}$|^\t{1,}$

罫線 ( Horizontal )


^(\* ){3,}$|^\*.$|^(- ){3,}|^-{3,}$|^(_ ){3,}$|^_{3,}$

リンク ( Link )

[an example](http://example.com/ "Title")


\[.*\]\((https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)[\t{1,}|\s{1,}]"".*""\)

[This link](http://example.net/)

\[.*\]\((https?|ftp)(:\/\/[-_.!~*\\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)

[an example][id]
[an example] [id]


\[.*\]\((https?|ftp)(:\/\/[-_.!~*\\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\) 

\[.*\]:[\t{1,}| {1,}](https?|ftp)(:\/\/[-_.!~*\\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)[\t{1,}| {1,}]"".*"" 

強調(em, em, strong, strong)


\*.*\*|_.*_|\*\*.*\*\*|__.*__

ソースコード ( Source code )


`.*`

画像 ( Image )


!\[.*\]\(.*\)|!\[.*\]\[.*\]|\[.*\]: .*"".*""

自動リンク(メールアドレスとURL) ( Auto Links )

※以下などを参考にさせていただきました
http://catbot.net/blog/2007/06/re_php.html

<(https?|ftp)(:\/\/[-_.!~*\\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)>

メールアドレスを厳密にフォローするのは難しいようで、以下がベストプラクティス?といった感じです。

<(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:""(?:\\[^\r\n]|[^\\""])*"")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))>

コメントアウト(複数行含めたコメント全部)( Comment out )




Markdown Extra の正規表現

HTMLブロック内のMarkdown記法(Markdown Inside HTML Blocks)


\\s*markdown\\s*=\\s*(?>([\"\'])(.*?)\\1|([^\\s>]*))()(?[\\w:$]+(?:(?=[\\s\"\'/a-zA-Z0-9])(?>\".*?\"|\'.*?\'|.+?)*?)?>||||)

特殊な属性 ( Special Attributes )


(^.+?)(?:[ ]+.+?)?[ ]*\n(=+|-+)[ ]*\n+

^(\\#{1,6})[ ]*(.+?)[ ]*\\#*(?:[ ]+.+?)?[ ]*\n+

コードブロック区切り(Fenced Code Blocks)


(?:\\n|\\A)(~{3,})[ ]*(?:\\.?([-_:a-zA-Z0-9]+)|\\{.+?\\})?[ ]*\\n((?>(?!\\1[ ]*\\n).*\\n+)+)\\1[ ]*\\n

表組み ( Tables )


^[ ]{0,2}[|](.+)\\n[ ]{0,2}[|]([ ]*[-:]+[-| :]*)\\n((?:[ ]*[|].*\\n)*)(?=\\n|\\Z)

^[ ]{0,2}(\\S.*[|].*)\\n[ ]{0,2}([-:]+[ ]*[|][-| :]*)\\n((?:.*[|].*\\n)*)(?=\\n|\\Z)

定義リスト ( Definition Lists )


(?>\\A\\n?|(?<=\n\n))(?>(([ ]{0,}((?>.*\\S.*\\n)+)\\n?[ ]{0,}:[ ]+)(?s:.+?)(\\z|\\n{2,}(?=\\S)(?![ ]{0,}(?: \\S.*\\n )+?\\n?[ ]{0,}:[ ]+)(?![ ]{0,}:[ ]+))))

脚注 ( Footnotes )


^[ ]{0,}\\[\\^(.+?)\\][ ]?:[ ]*\n?((?:.+|\n(?!\\[\\^.+?\\]:\\s)(?!\\n+[ ]{0,3}\\S))*) 

省略表記 ( Abbreviations )


^[ ]{0,}\\*\\[(.+?)\\][ ]?:(.*)

バックスラッシュエスケープ ( Backslash Escapes )


\\:|\\\|