Markdown、Markdown Extra の正規表現一覧


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

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

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

![GitHub_icon.png](https://qiita-image-store.s3.amazonaws.com/0/30945/69cbb5a0-7be2-8e43-962a-f574488fbcb8.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 )

<pre>
\s\s$
</pre>

### 見出し１ ( Header 1 ) 

<pre>
^#[^#]*?$"
</pre>

および、

<pre>
^.*\n=+$
</pre>

### 見出し２ ( Header 2 )

<pre>
^##[^#]*?$"
</pre>

および、

<pre>
^.*\n-+$
</pre>

### 見出し３ ( Header 3 )

<pre>
^###[^#]*?$
</pre>

### 見出し４ ( Header 4 )

<pre>
^####[^#]*?$
</pre>

### 見出し５ ( Header 5 )

<pre>
"^#####[^#]*?$
</pre>

### 見出し６ ( Header 6 )

<pre>
^#####[^#]*?$
</pre>

### 引用 ( Brockquote )

<pre>
^>.*$
</pre>

### リスト ( Lists )

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

### コードブロック ( Code blocks )

<pre>
^ {4,}$|^\t{1,}$
</pre>

### 罫線 ( Horizontal )

<pre>
^(\* ){3,}$|^\*.$|^(- ){3,}|^-{3,}$|^(_ ){3,}$|^_{3,}$
</pre>

### リンク ( Link )

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

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


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

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

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

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

[id]: http://example.com/  "Optional Title Here"

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

### 強調（em, em, strong, strong）

<pre>
\*.*\*|_.*_|\*\*.*\*\*|__.*__
</pre>

### ソースコード ( Source code )

<pre>
`.*`
</pre>

### 画像 ( Image )

<pre>
!\[.*\]\(.*\)|!\[.*\]\[.*\]|\[.*\]: .*"".*""
</pre>

### 自動リンク（メールアドレスと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 )

<pre>
<!--((?:.|\n)+)-->
</pre>

<br />

## Markdown Extra の正規表現

### HTMLブロック内のMarkdown記法（Markdown Inside HTML Blocks）

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

### 特殊な属性 ( Special Attributes )

<pre>
(^.+?)(?:[ ]+.+?)?[ ]*\n(=+|-+)[ ]*\n+
</pre>

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

### コードブロック区切り（Fenced Code Blocks）

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

### 表組み ( Tables )

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

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

### 定義リスト ( Definition Lists )

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

### 脚注 ( Footnotes )

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

### 省略表記 ( Abbreviations )

<pre>
^[ ]{0,}\\*\\[(.+?)\\][ ]?:(.*)
</pre>

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

<pre>
\\:|\\\|
</pre>