組み込みの正規表現ライブラリ

正規表現(正則表現, Regular Expression) とは、文字列の照合条件を一定の規則で表現したものです。

注釈

本頁は実質的に wxWidgets に含まれる wxRegEx の Syntax of the builtin regular expression library 邦訳です。2011年9月時点(安定版が 2.8 の時期)の文書を基にしています。

本頁自体はキー入力入れ替えソフト 姫踊子草 取扱説明書の一部ですが、本頁の一部または全部を任意に複製・引用いただいて構いません。

なお、めいっぱい訳者好みの訳語・意訳を用いていますのでご利用になる場合は一応留意しておいてください。

注釈

表題に言う「組み込みの」とは、本来は wxWidgets の wxRegEx に含まれている、という意味です。

ここでは姫踊子草の個別対応の対象指定で使える、と読み替えていただいて構いません。

姫踊子草は ARE を用いた全体一致で判定を行います。部分一致で照合させたい場合は両端または必要な片方の端に .* を置いてください。

正規表現の種類

正規表現(“RE”s)は POSIX により定義され、基本正規表現(basic REs = “BRE”s)と拡張正規表現(extended REs = “ERE”s)の二種類があります。拡張正規表現は egrep、基本正規表現は ed で慣習的に使われてきたものを基にしています。

注釈

egrep, ed ともに Unix で使われるソフトウェアの名前。egrep はファイル検索ソフトウェア、ed はテキストエディタ。

wxWidgetsではこれらに加えて発展型正規表現(advanced REs = “ARE”s)を実装しています。ARE はほぼ ERE と同じですが特徴的な例外を持っています。

本書では主に ARE について記載しています。BRE は後方互換性・いくつかの古いプログラム向けに残されているものです。この点は後ほど記します。

POSIX の ERE は概ね ARE の部分集合です。ARE にあって ERE にないものは都度そのことを記しておきます。

正規表現の文法

これらの正規表現実装は Henry Spencer が作った POSIX 1003.2 仕様の処理集合といくつかの Perl5 拡張を用いて構築されました。正規表現の下記説明は大部分が Henry の説明項目からそのまま借用したものです。

注釈

Perl(5) はプログラミング言語の一種、POSIX は情報処理に関する規格のひとつ。いずれも広く利用されている。

分枝

ARE は分枝を持つことができます。分枝の区切りは縦棒記号 | (U+007C)を使います。並置関係にある分枝はそのうちの一つが合致すれば並置分全体が合致したことになります。

各分枝は零個以上の計数可能要素限定子をつないだ表現になります。分枝のいずれかに合致部分があると、合致部直後の後続表現と後続文字列が照合されていきます。空の分枝は空文字列に合致します。

計数可能要素

計数可能要素は次のいずれかです。表内の re は任意の正規表現です。

要素 内容
(re) re に合致した部分を一単位として扱う。合致部参照などでも利用可。
(?:re) re に合致した部分を一単位とするが、参照不要扱い。合致部参照の参照先にはできない。
() 後から参照可能な空文字列として合致。
(?:) 参照不要の空文字列として合致。
[字群] 字群のうちどれか一字に合致。角括弧表現を参照のこと。
. 任意の一文字に合致。
\k

k が英数字ではない場合、k そのもの。

例えば \\ は \ 一文字に合致。

\c ARE のみで利用可。c が英数字の場合、エスケープを示す。
{ 数値が後続していれば回数の限定、そうでなければ { そのもの。
x x がその他の特殊文字に一致しなければ x そのもの。

数量子

計数可能要素は数量子を一つだけ直後に置くことができます。数量子がない場合は一つずつの合致になります。数量子とその意味は次のとおりです。

数量子 意味
* 0回以上の最大限連続した計数可能要素
+ 1回以上の最大限連続した計数可能要素
? 0回、可能なら1回の計数可能要素
{m} m 回の連続した計数可能要素
{m,} m 回以上の最大限連続した計数可能要素
{m,n} m 回~ n 回の最大限連続した計数可能要素
*? +? ?? {m}? {m,}? {m,n}?

上記の控えめな合致。

最大限ではなく最小限の回数で照合を進める。

{ と } を使った表現は縛りと言われています。数値 m と n は0から255の非負整数です。

限定子

限定子は特定条件を満たした空文字列に合致します。数量子をつけることはできません。単純な限定子は次のとおりです。複雑なものは限定子エスケープを参照ください。

表内の re は任意の正規表現です。

限定子 意味
^ 行頭に合致します。
$ 行末に合致します。
(?=re)

先読み合致。ARE のみで利用可。

この表現の直後が指定の re と一致する場合に空文字列として合致します。

(?!re)

先読み非合致。ARE のみで利用可。

この表現の直後が指定の re と一致しない場合に空文字列として合致します。

先読み合致/非合致限定子はその re に合致部参照を含むことができません。また、この re に含まれる丸括弧は自動的に参照不要扱いになります。

一つ一つの正規表現は \ で終わることはないはずです。

角括弧表現

角括弧表現は [ と ] の間に収められた文字の集合です。集合中のどれか一文字に合致します。[ の直後が ^ であった場合は、残りが除外文字として扱われ、どれにも一致しなかったときに合致したとみなします。

集合のなかに - でつながれた二文字がある場合は、その二文字を含めたすべての文字を表したことになります。例えば ASCII互換における [0-9] は [0123456789] を表します。

一つの文字を両側の - で共用することはできません。 a-c-e といった表現はできないことになります。 - の意図する範囲は各文字に与えられた符号・番号に依存します。汎用性のあるプログラムはこの機能に頼らないようにする必要があります。

注釈

wxWidgets の Windows における Unicode ビルドは (Windows における) UTF-16 互換になっています。姫踊子草もこれに準じています。

つまり、半角全角を問わず一文字が 16 ビット一単位で表現されており、他方 Unicode で U+10000 を超える符号を持つ文字は二単位で取り扱うようになっています。

角括弧表現の集合に ] や - そのものを含めたい場合にはいくつかの方法があります。

  • 一つは [. と .] で括る方法で、そのまま ] と - を記述できるようになります。
  • もう一つはそれらを最初の文字(または除外を表す ^ の直後の文字)にするという方法です。
  • ARE を使っている場合は \ を前置する方法が使えます。
  • - に限られますが、- を最後の文字にするか - による区間指定の終端側に置く方法もあります。
    • 開始端に置く場合は [. と .] で括るか ARE のもとで \- を使うしかありません。

これらの例外を除けば、角括弧表現の中における [ を使った特殊な組み合わせ、エスケープ、その他の特殊文字の意味が失われます。

単独の文字、単独文字のように扱ってほしい連続した文字、あるいはそれらの名称を [. と .] で括って一単位の照合要素とし、角括弧表現の中に置くことができます。

ただし現時点では「単独文字のように扱ってほしい連続した文字」が wxWidgets に定義されていません。従って [.X.] の X は一文字か文字名のいずれかです。例えば [[.0.]-[.9.]] と [[.zero.]-[.nine.]] はいずれも [0-9] を表します。

また同じような似た字がある文字またはその名称を [= と =] で括って角括弧表現の中に置くと、その要素は当該類字の集合を意味します。この類似集合を - で示す範囲の一端に指定することはできません。

ただし現時点では類似集合も wxWidgets には定義されていません。従って [=X=] は単に X 一文字を表します。 X は文字そのものでも文字名でも構いません。

注釈

[. .] と [= =] については木村浩一さんによる正規表現メモを参照のこと。

前者は欧文文字のリガチャ(合字)、後者はウムラウトなどの変化形を一つにまとめるための使うようですが、上記訳文のとおりほとんど役に立たない模様です。

正直訳者もよくわかっていません。

角括弧表現の中で [:文字種名:] という表現を使うと、文字種に含まれる全ての文字を対象とした一文字分の合致候補とします(全ての文字をつなげたものが候補になるわけではありません)。標準の文字種は次のとおりです。

文字種表現を - で示す範囲の一端に指定することはできません。

文字種名 意味
alpha (アルファベットの)一文字
upper 大文字一文字
lower 小文字一文字
digit 数字一文字
xdigit 十六進数に使われる数字一文字
alnum アルファベットか数字一文字
print アルファベットか数字一文字 (alnumと同じ)
blank 空白またはタブ文字
space 表示されたときに空白に見える文字
punct 約物
graph 見える文字
cntrl 制御文字

wxWidgets の非 Unicode ビルドでは文字種の内容が現在のロケールに依存します。実際の内容は isalpha や isupper など C の is で始まる関数の判断に従います。Unicode ビルドでは Unicode の文字種定義に従いますので現在のロケールには依存しなくなります。

上記のほか、文字種名の部分に < > を用いると単語の開始端と終了端に合致します。

  • [[:<:]] や [[:>:]] の合致部分は空文字列になります。
  • 単語とは alnum に下線文字( _ )を加えた文字だけで一続きに繋がっている部分を指します。
  • [[:<:]] および [[:>:]] はお勧めしません。ARE を使っている場合はエスケープを利用すべきです。

エスケープ

エスケープは ARE でのみ使えます。\ と直後の(半角)英数字一文字によっていくつかの機能を提供します: 文字、文字種の短縮表記、規制のためのエスケープ、合致部参照など。定義されていないエスケープはエラーになります。

ERE にはエスケープがありません。角括弧表現の外側では、\ に続く英数字はその英数字そのものとなり、内側では \ が一般文字として処理されます(この内側の処理が ARE と ERE の非互換部分になっています)。

文字項目エスケープによって、印刷できない文字や正規表現内で使うのが不便な文字を指定することができます。

エスケープ 意味
\a 警告(ベル)文字、C言語のそれと同じ
\b バックスペース、C言語のそれと同じ
\B \\ と同じ。 多重化して読みにくくなるのを防ぐために用意されている。
\cX (Xは任意の文字) 下位5ビットが X と同じで他のビットがすべて零の文字
\e ‘ESC’ と呼ばれる文字か、もし該当するものがなければ八進数で 033 の符号を持つ文字
\f フォームフィード、C言語のそれと同じ
\n 改行、C言語のそれと同じ
\r 復帰、C言語のそれと同じ
\t 水平タブ、C言語のそれと同じ
\uwxyz Unicode における U+wxyz に相当する文字 (wxyzは四文字固定の十六進数)
\Ustuvwxyz Unicode が 32ビットに拡張されたときの予約 (stuvwxyzは八文字固定の十六進数)
\v 垂直タブ、C言語のそれと同じ
\xhhh

文字符号が十六進数で 0xhhh と表される文字 (hhhは任意の十六進数)

桁がいくつあっても単一の文字に置き換えられます。

\0 文字符号(番号)が零の文字
\xy 文字符号が八進数で 0xy と表される文字 (xyは二文字固定の八進数で後述の合致部参照ではない)
\xyz 文字符号が八進数で 0xyz と表される文字 (xyzは三文字固定の八進数で後述の合致部参照ではない)

注釈

C言語もプログラミング言語の一種。本来は「言語」を伴わず C というが、わかりにくいのでよくつけられる。

Unicode はすでに16ビットを超えた文字符号が使われていて、また24ビットまでしか使わないことが決定されています。

が、上記の文章が残されたままであるところを見ると U+FFFF の範囲まででしか動作しないように思われます。たぶん越えた部分は代用対で。

十六進数に使われる文字は ‘0’-‘9’, ‘a’-‘f’, ‘A’-‘F’ です。八進数に使われる文字は ‘0’-‘7’ になります。

文字項目エスケープは文字そのものとして扱われ、エスケープの結果が特殊文字の機能を持つことはありません。例えば \135 は ASCII互換で ] を意味しますが、\135 が ] の代わりに角括弧表現の末尾という意味にはなりません。

ですが、C コンパイラのようないくつかのアプリケーションは正規表現の処理に回される前にアプリケーション自身のエスケープを行うことに注意する必要があります。C のソースコードなどにおいてはエスケープの開始を表すために \\ と書き、また \\ と書きたい場合は \\\\ と書かなくてはなりません。

注釈

\ を二個ないし四個並べる話は、姫踊子草で使う分には関係ないので適用しないでください。

ARE では文字種の短縮表記がいくつか利用できます。

短縮表記 同義表現
\d [[:digit:]]
\s [[:space:]]
\w [[:alnum:]_] (下線を含むことに注意)
\D [^[:digit:]]
\S [^[:space:]]
\W [^[:alnum:]_] (下線も除外されることに注意)

角括弧表現の中では \d, \s, \w の外側角括弧分の意味が失われ、 \D, \S, \W は利用できなくなります。

  • [a-c\d] は [a-c[:digit:]] と同じ意味になります。
  • [a-c\D] は [a-c^[:digit:]] となりますが、利用できません。

限定子エスケープと合致部参照

ARE では限定子エスケープも使うことができます。特定の条件が成り立つとその位置で空文字列と合致したことになります。

限定子 限定合致条件
\A 文字列の開始端( ^ との違いについては後述の照合も参照ください)
\m 単語の開始端
\M 単語の末尾端
\y 単語の開始端または末尾端
\Y 単語の開始端でも末尾端でもない場所
\Z 文字列の末尾端( $ との違いについては後述の照合も参照ください)
\m 合致部参照、後述 (m は正整数一桁)
\mnn 合致部参照、後述 (m は正整数一桁で nn は数字、十進数値 mnn は参照可能な丸括弧括りをそこまでに使用した数を超えない)

[[:<:]] や [[:>:]] と同様、単語とは alnum に下線文字( _ )を加えた文字だけで一続きに繋がっている部分を指します。

限定子エスケープは角括弧表現の中では使えません。

合致部参照は先行する部分正規表現を序数で参照するものです。部分正規表現は丸括弧 ( ) で括っておきます。

  • ([bc])\1 は bb または cc に合致しますが bc には合致しません。
  • 参照される部分正規表現は参照元を記述している部分より前で定義を完結させてください。
  • 部分正規表現は開き丸括弧が現れた順で序数が振られていきます。
    • 参照不要とされた分、つまり (?: で始まるものは数に含まれません。

歴史的な理由で八進数の文字項目エスケープと合致部参照の間にあいまいさが残されています。これは上述の定義により自動的に区別されます。

  • \ の直後に0 がきた場合は八進数エスケープです。
  • 数字が一桁で 0 ではない場合は常に合致部参照になります。
  • 複数桁で開始が 0 では場合については、
    • 適切な数の部分正規表現が先行している場合に限り合致部参照となり、
    • そうでなければ八進数として扱われます。

上位文法

ここまでに記した文法に加え、いくつかの特殊形と雑多な文法機能が用意されています。

正規表現の種別は、通常アプリケーションが定義したものが使われます。しかしながら指導子によってこれを上書きすることができます。***: で始まる正規表現は常に ARE として処理されます。***= で始まっている場合は残りの全てがただの文字として処理されます。

ARE の先頭には動作選択子を加えることが出来ます。 (?動作選択子) という形で 残りの正規表現に特定の解釈を与えられるようになります。この補足機能はアプリケーションが定義した規定の選択を上書きできます。動作選択子は一文字以上のアルファベットです。

動作選択子 残りの部分に影響する内容
b 残りの部分は BRE として処理される
c 大文字と小文字を区別する ( i が指定されていない状態、標準の動作)
e 残りの部分は ERE として処理される
i 大文字と小文字を区別しなくなる (後述の照合を参照ください)
m n と同じ、古いものとの互換性を保つためのもの
n 無跨行照合を行う
p 部分的に無跨行照合を行う
q 残りの部分にある特殊文字を機能させず、そのままの文字として扱う
s 改行を跨ぐ合致を認める (無跨行照合指定がない状態、標準の動作)
t 文法を厳格に適用 (特に指定がなければ標準の動作、後述)
w 部分的な無跨行照合を反転させる (「不自然な」照合、後述)
x 拡張文法、後述

動作選択子は ) で閉じた後から効果を持ちます。ARE の開始端でのみ有効で、それ以降の位置で途中から使うことはできません。

通常の(厳格な)正規表現文法は全ての文字が意味を持ちます。これに加えて拡張文法が動作選択子 x により利用可能となります。拡張文法においては、空白文字類が無視され、また # から改行または正規表現の末尾までの文字も無視されるようになります。これにより複雑な表現の中に注釈を入れることができます。

この機能には三つの例外があります。

  • \ が直前にある空白文字類や # はこのような機能を持ちません。
  • 角括弧表現の中にある空白文字類や # はこのような機能を持ちません。
  • ARE の (?: や BRE の \( のような複数文字による記号の中に空白文字類や # を置くことはできません。

拡張文法における空白文字類とは、半角空白、タブ、改行など space character class に含まれる全ての文字です。

ARE の角括弧表現外においては (?#注釈) の形で完全に無視される文字を記述できます。

  • ただし注釈に ) を含むことはできません。
  • この機能も (?: のような複数文字記号の中に置くことはできません。この注釈機能はこれまでに紹介したものよりも歴史的によく使われているものですが、お勧めできないものです。新しい表記法を使ってください。

アプリケーションが制限したり ***= 指導子が使われたりして文字列がそのまま扱われるようになっている場合はこれらの上位文法機能は(残りの部分で)一切使えなくなります。

照合

与えられた文字列の複数箇所で正規表現に合致する場合は、文字列内の一番初めの部分に合致したことになります。同じ開始点で複数の合致形が考えられる場合はその位置での 事前設定 により決められます: もっとも長い合致かもっとも短い合致が適用されます。

  • 大部分の計数可能要素限定子には事前設定がありません。
  • 丸括弧で括られた正規表現はその正規表現と同じ事前設定になります(設定がない場合あり)。
  • 数量子 {m} または {m}? のついた計数可能要素は計数可能要素と同じ事前設定になります(同)。
  • その他の数量子の場合は、控えめな合致を求めているかどうかで最短一致か最長一致が事前設定にになります。
    • これにより {m,n} は最長一致になります。m = n の場合も {m} と異なり最長一致です。
    • 同様に {m,n}? は最短一致になり、m = n の場合も {m}? と異なり最短一致です。

単一の分枝内では計数可能要素のうち最初に事前設定を持っているものと同じになります。複数の分枝が | で接続されている場合は最長一致を提供できる正規表現が採用されます。

正規表現全体が指定する合致適用の規則に従い、部分正規表現も最長ないし最短一致が試みられます。そこで使われる事前設定は開始点が文頭側にある正規表現の設定のほうが文末側にある正規表現より高い優先順位を持ちます。このため部分正規表現よりも、それを内包した外側の正規表現が高い優先順位を得ることに注意してください。

数量子 {1,1} と {1,1}? はそれぞれ強制的に最長一致と最短一致の事前設定を与えることができます。部分正規表現と正規表現全体のいずれでも可能です。

合致の長さは(正規表現上の要素数ではなく)文字列側の文字数で比較されます。

  • 空文字列は非合致よりは長いものとして処理されます。
  • bb* は abbbc の中央三文字に合致します。
  • (week|wee)(night|knights) は weeknights の十文字全部に合致します。
  • (.*).* を abc に照合させると、丸括弧内の部分にabc の三文字全部が合致します。
  • (a*)* を bc に照合させた場合は部分・全体のどちらの正規表現も空文字列になります。

大文字小文字に依存しない照合を行っているときは、アルファベットからそれらの区別が消えてしまったかのように動作します。

  • 大文字形と小文字形をもつアルファベットが角括弧表現外に現れた場合は大文字と小文字を両方含んだ角括弧表現に変換されます。
  • 角括弧表現内に現れた場合は逆側の表記が角括弧表現内に追加されます。
  • 従って x は [xX] に、[x] は [xX] に、[^x] は [^xX] にそれぞれ置き換えられます。

無跨行照合が設定されていると、

  • ^ の入った角括弧表現と . は改行には合致しなくなります。つまり改めて変更しない限り行を超えた合致判定は発生しなくなります。
  • ^ と $ は文字列全体の先頭・末尾のほか、それぞれ改行の直後と直前の位置でも空文字列と合致するようになります。
  • ARE の \A と \Z はこれらと異なり与えられた文字列の先頭または末尾だけに合致します。

部分無跨行照合が設定された場合は前述のうち角括弧表現と . に対してのみ効果が現れ、^ と $ については改行を考慮しないままとなります。

部分無跨行照合の反転が用いられると ^ と $ が改行のの直後直前を考慮するようになる一方角括弧表現と . に対する動作は元のままになります。こちらはあまり意味がありませんが、対照的な動作を提供するために用意されています。

制限と互換性

正規表現の長さに関する明示的な制限はありません。POSIX 準拠の実装が拒絶する可能性があるので、高い可搬性を要求されるプログラムは256文字を超える正規表現を避けるべきです。

ARE の機能のうち POSIX の ERE と互換性を持たないのは角括弧表現内の \ が特殊記号であり続けるという一点だけです。他の ARE の機能は POSIX の ERE においては不正・未定義または予期しない動作をもたらすものです。*** による指導子文法は POSIX の BRE にも ERE にも定義されていません。

ARE 拡張の多くは Perl から借用したものです。いくつかは整理のために変更され、いくつかは実装されていません。\b と \B の追加、末尾の改行に対する特別扱いの取りやめ、無跨行照合に掛かる機能を追加された角括弧表現、先読み合致限定子における合致部参照の制限、優先順検索に代わって最短/最長一致の考え方が採用されている点が異なります。

正規表現の照合規則は通常/控えめのいずれの方法も初期のベータテスト版から変更されています。現在の規則はより単純で整理されていますが、利用者側の意図を推測するような仕様は減らされています。

1986年の Henry Spencer が作った最初の regexp 処理集合は今日で言う初期の ERE を実装しており現在も広く使われています。近年の ERE (near-ERE, RREs とも略される) と ARE には四つの非互換性があります。概して優先順位のつけ方に関するものです。

  • ARE では \ と直後のアルファベット一字の組み合わせはエスケープかエラーです。RREs では単なるアルファベットの代用表記です。しかしわざわざこの表記を使う理由はないと思われるので大きな問題にはならないはずです。
  • { と直後の数字一字の組み合わせは ARE においては縛りの開始点です。RREs では { も一般の文字の一つに過ぎません。正規表現内の一般文としてこの組み合わせが来ることは少ないでしょうし、もし来たとしても縛りの形が完結しないので ARE では不正な表現と検出されやすいでしょう。
  • ARE では [ と ] の中でも \ の特殊機能は維持されます。従って \ そのものを指定する場合は \\ と記述しなくてはなりません。RREs でも \\ は \ に変換されるだけですが、RRE でそれをやっているのは実に神経質なプログラマーだけでしょう。
  • ARE は正規表現に対する最長または最短の一致を検索するのであって検索順で最初に見つかったものを検索結果とするのではありません。このことが RREs 由来の正規表現で意図しない結果をもたらすことがあります。ですから高速化を狙った RRE の綿密な最適化は ARE には勧められないものになっています。RRE の検索順序を考慮・活用した正規表現が最長/最短一致とは異なる結果をもたらすときは、それを ARE 用に書き直さなくてはなりません。 ARE は考えうる合致形を並行的に照合します。この方法が複雑さに対する性能の向上に役立っています。

基本正規表現

BRE は ERE に対して数箇所の違いがあります。

  • | + ? の三文字は一般文字でしかなく ERE のような特殊機能は持っていません。
  • 縛りに使われる記号は \{ と \} 、部分正規表現に使う丸括弧は \( と \) になります。単独の ( ) { } の各文字はそれぞれ一般文字扱いです。
  • ^ は正規表現全体の先頭と部分正規表現内の先頭を除いて一般文字扱いです。
  • $ は正規表現全体の末尾と部分正規表現内の末尾を除いて一般文字扱いです。
  • * は正規表現全体の先頭・部分正規表現内の先頭または ^ の直後に一般文字として使うことができます。
  • 合致部参照は数字一桁の場合に限って有効です。
  • \< と \> はそれぞれ [[:<:]] と [[:>:]] の同義表現です。他のエスケープは利用できません。

正規表現における文字名一覧

ここで紹介している文字名は大文字と小文字を区別します。

文字名 実体
NUL \0
SOH \001
STX \002
ETX \003
EOT \004
ENQ \005
ACK \006
BEL \007
alert \007
BS \010
backspace \b
HT \011
tab \t
LF \012
newline \n
VT \013
vertical-tab \v
FF \014
form-feed \f
CR \015
carriage-return \r
SO \016
SI \017
DLE \020
DC1 \021
DC2 \022
DC3 \023
DC4 \024
NAK \025
SYN \026
ETB \027
CAN \030
EM \031
SUB \032
ESC \033
IS4 \034
FS \034
IS3 \035
GS \035
IS2 \036
RS \036
IS1 \037
US \037
space (半角空白)
exclamation-mark !
quotation-mark
number-sign #
dollar-sign $
percent-sign %
ampersand &
apostrophe
left-parenthesis (
right-parenthesis )
asterisk *
plus-sign +
comma ,
hyphen -
hyphen-minus -
period .
full-stop .
slash /
solidus /
zero 0
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
nine 9
colon :
semicolon ;
less-than-sign <
equals-sign =
greater-than-sign >
question-mark ?
commercial-at @
left-square-bracket [
backslash \
reverse-solidus \
right-square-bracket ]
circumflex ^
circumflex-accent ^
underscore _
low-line _
grave-accent
left-brace {
left-curly-bracket {
vertical-line |
right-brace }
right-curly-bracket }
tilde ~
DEL \177