正規表現の可視化

Snow Flower Text は 正規表現を Railroad図 で可視化することが可能です。追加のインストールなしに利用を始めることができます。一見して理解できない正規表現も、可視化することで直感的に理解できるようになります。

次の例はメールアドレスにマッチする簡易的な正規表現です。

正規表現
^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$

この正規表現は厳密ではない簡易的な記述ですが、一見して理解するのは難しいくらいに複雑に見えます。 この正規表現をRailroad 図で可視化すると次のようになります。

Railroad Diagram

可視化によって短時間で全体を理解することが簡単になったでしょう。このように議論の余地もなく正規表現の可視化の効果は非常に強力です。

Railroad 図はパターンの直感的な理解が可能です。正規表現の可視化は Snow Flower Text の独自拡張機能です。

使い方

AsciiDoc の [regex] ブロックに 正規表現を記述することで Railroad図で可視化された正規表現を文書に埋め込む事ができます。正規表現はPCRE(Perl Compatible Regular Expressions)シンタックスが使用できます。

  1. シンタックスに AsciiDoc を選択します。

  2. 正規表現の可視化には regex ブロックを使用します。

以下は U.S ZIPコードに一致する正規表現の例です。

[regex]
--------------------------------------------
^\d{5}$
--------------------------------------------

正規表現の詳細は “POSIX.2 正規表現” を参照してください。PCRE標準の詳細については PCRE を参照してください。

可視化の見本

短い正規表現と可視化図の対応を以下に示します。

Literal

Literal

Anchors

Start of line
^abc
End of line
abc$
Word boundary
\babc
Non-word boundary
\Babc

Character types

Any character
.
Digit
\d
Non-digit
\D
Hirozontal white space
\h
non hirozontal white space
\H
White space
\s
Non-white space
\S
Vertical white space
\v
Non vertical white space
\V
word
\w
non-word
\W

Character classes

文字クラスは、個々の文字の集合と一致するかどうかを示します。 先頭のコメントは「one of」か「none of」のいずれかになります。

Positive character class
[ab-d]
Negative character class
[^ab-d]
a or b
a|b

Special characters

Backspace character
[\b]

Quantifiers

0 or more
a*
1 or more
a+
Optional(0 or 1)
a?
Exactly 2
a{2}
Between 2 and 5
a{2,5}
2 or more
a{2,}

POSIX character classes

Letters and digits
[[:alnum:]]
Letters
[[:alpha:]]
Ascii codes 0 – 127
[[:ascii:]]
Space or tab only
[[:blank:]]
Control characters
[[:cntrl:]]
Decimal digits
[[:digit:]]
Visible characters, except space
[[:graph:]]
Lowercase letters
[[:lower:]]
Visible characters
[[:print:]]
Visible punctuation characters
[[:punct:]]
Whitespace
[[:space:]]
Uppercase letters
[[:upper:]]
Word characters
[[:word:]]
Hexadecimal digits
[[:xdigit:]]

Special characters

Newline
\n
Carriage return
\r
Tab
\t
Hexadecimal character YY
\x41
Hexadecimeal character YY
\x{123}
One digit
\d
One non-digit
\D
One whitespace
\s
One non-whitespace
\S
One word character
\w
One non-word character
\W

Escape sequences

Escapes a special character
\\Escape
Block Quoted
\Q(C++ ?)\E

グループ

Capturing group
(...)
Non-capturing group
(?:...)

複雑な正規表現の可視化例

以下は実際に使用される複雑な正規表現の可視化例です。

URL: HTTP/HTTPS
https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)
タイムスタンプ: YYYY-MM-DD
^\d{4}-\d{1,2}-\d{1,2}$
IPアドレス
[regex]
---------------------------------------
(?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
---------------------------------------
メールアドレスに99%合致する正規表現
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

参考

Download on the Mac App Store