意外と、まとまったページがなかったので、メモとして記事にしておきます。
僕はWindowsソフトでMarkdown記法に対応したテキストエディタ、
MarkDown#Editor
http://hibara.org/software/markdownsharpeditor
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 )
\\:|\\\|