カメリアの記事

意味があることやないことを綴ります

Markdown の * によるリスト内の * による強調にマッチさせる

EmEditor の Markdown 用のシンタックスハイライト構文ファイルご紹介」という記事を書いたことがあるのですが、当時はまだ解決できていない懸案があったのです。それがタイトルの問題でした。具体的には下のような Markdown の記述です。

* いろはにほへと
* ちり*ぬる*を
* わかよたれそ

この Markdown では記号「 * 」を使ってリストを形成し、その中で同じ記号を使って「ぬる」を強調( em )しています。この強調部分にだけマッチさせてシンタックスハイライトを実現する構文=正規表現がやっと作れました。それが下のものです。

(?:^\\* [^*]*)?(?<!\\*)\\*{1}([^*]+?)\\*{1}(?!\\*)

{1} という余分なものがついていますが、これは強調「 strong 」と関連を持たせるために特別に付けているものです。スルーしてください。

(?:^\\* [^*]*)?(?<!\\*)\\*{1}([^*]+?)\\*{1}(?!\\*)

赤い部分が行頭にあるリストの「 * 」にマッチさせつつキャプチャせず、なおかつ行頭の「 * 」があってもなくてもいいように「 ? 」としています。

(?:^\\* [^*]*)?(?<!\\*)\\*{1}([^*]+?)\\*{1}(?!\\*)

赤い部分では「 ** 」による強調( strong )にヒットしないよう前方不一致と後方不一致を指定しています。

(?:^\\* [^*]*)?(?<!\\*)\\*{1}([^*]+?)\\*{1}(?!\\*)

赤い部分が主目的である強調の記号「 * 」にマッチさせる部分です。

(?:^\\* [^*]*)?(?<!\\*)\\*{1}([^*]+?)\\*{1}(?!\\*)

赤い部分では強調される文字列を指定しています。強調の記号「 * 」でない文字の集まりですね。

あー、苦労した。