空文字列
形式言語理論における空文字列(くうもじれつ・からもじれつ、empty string)またはヌル文字列(null string[1])とは、長さが0の一意な文字列であり、文字列における空集合である。主にコンピュータ、特にプログラミング言語において用いられる用語である。
形式言語における空文字列
形式的には、文字列は文字や数字といったシンボルの有限列として表現されるが、空文字列はこの有限列の特殊なケースである。空文字列は長さがゼロであり、何のシンボルも含まない。また、空文字列は必ず一つしか存在しない。これは、2つの異なる文字列が存在する場合、文字列の長さか、文字列に含まれるシンボルのいずれかが必ず異なっているためである。形式言語では、空文字列はλで表される(λの大文字であるΛや、εを使う場合もある)。
空文字列を空言語∅と混同しないこと。空言語は、形式言語(文字列の集合)において、空文字列すらも含まない空集合のことを意味する。
空文字列の持つ性質を以下に挙げる。
- [math]| \lambda \, | = 0[/math]: 空文字列の長さは0となる。.
- [math]\lambda \, + s = s + \lambda \, = s[/math]: ある文字列に空文字列を連結しても、元の文字列と同じものになる。空文字列は、文字列連結における単位元である(ある文字集合Σにおいて自由モノイドを構成する)。
- [math]{ \lambda \, }^R = \lambda \,[/math]: 空文字列は反転しても空文字列のままとなる。
- 辞書式順序では、空文字列はいかなる文字列よりも前に配置される。これは空文字列が最も短い文字列であるためである。[2]
プログラミング言語における利用
多くのプログラミング言語において、各文字列はそれぞれ個別のメモリ領域に格納される。そのため、同じ内容の文字列(例えば空文字列)がメモリ上の複数箇所に格納されることがある(長さ0の文字列でも格納にはメモリが必要なことに注意。使用するメモリの量は文字列の格納形式により異なる)。この場合、形式言語の定義と異なり、複数の空文字列がメモリ上に同時に存在することになる。しかし、文字列比較関数を使えば、これらの空文字列は全て同じであることを示すことができる。
空文字列はヌルポインタやヌル参照とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は多くの場合エラーが発生するが、空文字列に対する処理でエラーが発生することは比較的少ない。たとえばJavaにおいてヌルの長さを求めるとNullPointerExceptionなどの例外が発生するが、空文字列の長さを求めれば0が返される。また、空文字列とヌルを比較すると偽が返される。これは、オブジェクト指向言語においてヌルは型情報を持たないためである。
プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。
また、プログラミング言語によっては、変数が最初に使われるとき、あらかじめ空文字列が入っているものとするものもある。
通常、空文字列は他の文字列と同じように表現される。文字列を、文字列終端文字を使用して(ヌル終端文字列または改行区切りのプレインテキストとして)実装している場合、空文字列は単一の文字列終端文字で表現される。
- プログラミング言語によっては、数値など文字列でないものと空文字列を連結すると、変数の型を文字列に型変換する。
- Oracle Databaseでは空文字列とヌル (SQL)が区別されない。
- 多くのプログラミング言語において、空文字列は最小のクワインである。
空文字列の表現 | プログラミング言語 |
---|---|
""
|
C, C++, Perl, Python, C#, Go, PHP, Visual Basic .NET, Java, Turing, JavaScript, Haskell, Objective-C (C言語形式の文字列の場合), OCaml, Standard ML, Scala, Seed7, Tcl |
''
|
Perl, PHP, Python, JavaScript, Delphi, Pascal |
{'\0'}
|
C, C++, Objective-C (C言語形式の文字列の場合) |
std::string() ""s
|
C++(後者の記法を利用するには、あらかじめusing std::literals; が必要)
|
@""
|
Objective-C (NSString 型定数オブジェクトの場合)
|
[NSString string]
|
Objective-C (NSString オブジェクトを新規に作成する場合)
|
q()
|
Perl |
%{}
|
Ruby |
"""""" str()
|
Python |
string.Empty
|
C#, Visual Basic .NET |
String.make 0 '-'
|
OCaml |
{}
|
Tcl |
空文字列の例
- 位取り記数法では、空文字列はいかなる基数においても0を表す(先行ゼロがない場合においても)。ただし形式言語理論以外の領域では、空文字列は視覚的に表現ができないため、ゼロという数は伝統的に数字0の形で表現される。
- 文字列が文字へのポインタで表されるC言語などでは、ヌル文字へのポインタで表される文字列となる。ゼロで埋められたメモリ領域をヌル終端文字列として解釈すると空文字列となる。
- 空文字列はテキスト中の空行という形でも現れる。テキストファイルでよく見られるように、改行コードを2つ連続させることで空行が発生する。空行の用途として、テキスト処理で段落の区切りを表現するのに使われる場合がある(例:MediaWiki)。
関連項目
参考文献
- ↑ Kernighan and Ritchie, C, p.38
- ↑ CSE1002 Lecture Notes - Lexicographic