デベロッパーズコーナー:エンジニアのためのXMLスキーマ講座「基礎2:新しいデータ型を作る!」(4)
2002年08月07日作成
(株)日本ユニテック
奥井 康弘
<この記事はDigital Xpress 2001 Vol.6(12-1月号)に掲載されたものです>
前回は、XML Schema指定として要素宣言、型定義、属性宣言の3つについて説明しました。今回は、データ型について詳しく説明します。特に、文字列のパターンを指定する方法を詳しく説明し、みなさん独自のデータ型を作る「達人」になっていただきます!
<<前ページ「値の候補の列挙」について4.パターン
「2桁の数字のあとハイフン、そのあと4桁の数値のあとハイフン、そして4桁の数字」。さて、これは日本のある地域の電話番号の「字句的な」構成パターンです。このような「文字の種類」あるいは「具体的な文字」を指定して、指定できる文字列の構成パターンを定義することもできます。これもファセットであり、xsd:patternを使用します(リスト4参照)。
<リスト4>| (スキーマ文書) |
| <xsd:element name="TEL"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{2}-\d{4}-\d{4}"/> </xsd:restriction> </xsd:simpleType> </xsd:element"> |
| (XMLインスタンス) |
| <TEL>03-3595-8241</TEL> |
この"\d{2}-\d{4}-\d{4}"の部分が文字列のパターンを表現したものです。
この他パターンを使って次のような様々な文字列指定を行うことができます。まずは、パターンとはどのようなものか、これを見て感じをつかんでください。
| 第 [1-9][0-9]*章 | 「第」のあとに任意の桁数の数字。ただし数字の先頭に0は使わない。そして最後に「章」を付ける。 |
| [a-c]+ | aからcまでの文字が1文字以上。 |
| [A-F]{2,5} | AからFのどれか2文字から5文字。「AC」や「EFACC」など。 |
| \p{IsHiragana}{4} | ひらがな4文字。 |
| "student(s)?" | 「student」または「students」。 |
| 章|節|段落 | 「章」「節」「段落」のどれか。 |
| (2000|2001)年 | 「2000年」または「2001年」のどちらか。 |
では、後はこのパターンの書き方について詳しく説明します。ちょっと疲れるかもしれませんが、これを極めれば、あなたは「XML Schema大王」と呼ばれることでしょう!がんばってください。
使用できる文字を連結させる形で表現するのがパターン表記の基本です。パターンの中に、「文字の種類」や「文字の範囲」などを定められた仕方で書きます。(図1参照)
<図1:パターンの書き方>
ここで、"\d"は、「数字」という文字の種類を表すものです。これについては後で説明します。
●繰り返し数の指定
回数は"{4}"(4回)、"*"(0回以上無限回)、"?"(0回または1回)などを"\d"といった文字指定の後に書きます(表3参照)。
<表3:繰り返し回数の指定法>| ? | 0回または1回 |
| * | 0回以上 |
| + | 1回以上 |
| {n,m} | n回以上m回以下 |
| {n} | n回 |
| {n,} | n回以上 |
| {0,m} | m回以下 |
| {0,0} | 0回 |
●特定の文字の指定
"-"のように、文字を直接書けば、その文字を書くことを指定します。
●文字の選択範囲の指定
「文字の選択範囲」を示すこともできます。" [ABCD]"は、"A"、"B"、"C"、"D"いずれかの文字が書けるという意味です。 " [1-9]"という書き方は、1~9の範囲の文字のいずれか1つを使用するという意味です。
| "付録[ABEF]" | 「付録A」「付録B」「付録E」「付録F」のいずれか |
| "第[1-9][0-9]*章" | 「第1章」「第2章」「第10章」、「第11章」....「第99章」 |
"-"を使った範囲指定は、[ ]の中に連続して書くことにより、いくつかの範囲の中から1つの文字を選択することもできます。
| "付録[C-EG-I]" | 「付録C」から「付録E」と「付録G」から「付録I」のいずれか |
●Unicodeのカテゴリーまたはブロックによる指定
"\p{…}"と書くと、Unicodeの文字セット中の特定の集合から1つの文字を使用することを表します。特定の集合として、Unicodeの定めるカテゴリーやブロックを使うことができます。カテゴリーの場合は、そのカテゴリー名を書きます。ブロックの場合は、ブロック名の前に"Is"を付けます(表4参照)。
| Unicodeのカテゴリーで指定する \p{カテゴリー名} (指定されたカテゴリー内の文字) Unicodeのブロックで指定する \p{"Is"ブロック名} (指定されたブロック内の文字) |
(例)
| \p{Lu} | 大文字アルファベット |
| \p{Nd} | 数字 |
| \p{IsBasicLatin} | 基本ラテン語 |
| \p{IsHiragana} | ひらがな |
<表4:Unicodeのカテゴリー名とその意味>
| カテゴリー:字(Letters) | |
| Lu | 大文字(uppercase) |
| Ll | 小文字(lowercase) |
| Lt | タイトル文字(titlecase) |
| Lm | 修飾(modifier)(長音記号「ー」繰り返し記号「ゝ」など) |
| Lo | その他(other) |
| L | 字カテゴリー(Letters)の文字すべて |
| 結合文字(Marks) | |
| Mn | 幅なし(nonspacing)(濁点「゛」・半濁点「゜」など) |
| Mc | 幅あり(spacing combining) |
| Me | 囲み(enclosing) |
| M | 結合文字カテゴリー(Marks)の文字すべて |
| 数(Numbers) | |
| Nd | 10進数字(degital sdigit) |
| Nl | 字(letter)(ローマ数字など) |
| No | その他(other) |
| N | 数カテゴリー(Numbers)の文字すべて |
| 句読点(Punctuation) | |
| Pc | 接続(connector)(下線「_」や中黒「・」など) |
| Pd | ダッシュ(dash)(ハイフン「-」やダッシュ記号「―」など) |
| Ps | 開き(open)(開きカッコ「()など」 |
| Pe | 閉じ(close)(閉じカッコ「」)など) |
| Pi | はじめ引用符(initial quote) |
| Pf | 終え引用符(final quote) |
| Po | その他(other) |
| P | 句読点カテゴリー(Punctuation)の文字すべて |
| 分離子(Separators) | |
| Zs | 空白(space)(半角スペースや全角スペースなど) |
| Zl | 行(line) |
| Zp | 段落(paragraph) |
| Z | 分離子カテゴリー(Separators)の文字すべて |
| 記号(Symbols) | |
| Sm | 数学(math)(数学記号「+」「×」「÷」など) |
| Sc | 通貨(currency)(通貨記号「$」「¢」「\」など) |
| Sk | 修飾(modifier)(アクセント記号「´」「¨」など) |
| So | その他(other) |
| S | 記号カテゴリー(Symbols)の文字すべて |
| その他(Other) | |
| Cc | 制御(control) |
| Cf | 書式(format) |
| Co | 私用(private use)(いわゆる外字) |
| Cn | 未割り当て(not assigned)(文字に割り当てられていないコード) |
| C | その他カテゴリー(Others)の文字すべて |
\p{IsBasicLatin}の"Is"の後の"BasicLatin"は、カテゴリーとは別にUnicodeで定められている文字の分類であるブロックの名前です。" BasicLatin"は基本ラテン文字を表し#x0000~#x007Fの範囲の文字を表します。平仮名は"Hiragana"というブロック名で表現され#x3040~#x309Fの範囲の文字を表します。この場合は\p{IsHiragana}と書きます。
| "作品\p{IsBasicLatin}\d{4}" | 「作品A0001」「作品X2352」など |
| Unicodeのカテゴリーで指定する \P{カテゴリー名} (指定されたカテゴリー以外の文字) Unicodeのブロックで指定する \P{"Is"ブロック名} (指定されたブロック以外の文字) |
●指定の反転
ここまでに説明した文字指定を使って「それ以外」という「反転」の指定を行うこともできます。これには"^"を書きます。
| 指定されたもの以外を候補とする方法 "^"文字の指定 |
指定されたもの以外を指定する
| [^\p{Nd}] | \p{Nd}で表される数字以外 |
●文字クラスの引き算
このような文字の種類を使って「引き算」をすることもできます。文字グループから「引く」文字クラスを"-"のあとに指定します。
| 文字クラスの減算 文字グループ"-"文字クラス表現 |
| [\p{Nd}-[0]] | 数字から0を除いたもの。 |
| [\p{IsBasicLatin}-[\p{Nd}]] |
BasicLatinブロックから数字を除いたもの。 |
●簡略記法
よく使う複数文字の組み合わせについては複数文字エスケープとして次のような簡略表記が使用できます(表5参照)。
<表5:簡略記法>|
簡略表記
|
同じ意味を持つ正規表現
|
意味
|
| . (ピリオド) | [^\n\r] | 改行・復帰以外のすべての文字 |
| \s | [#x20\t\n\r] | 空白記号 注) |
| \S | [^\s] | 空白記号以外 |
| \I | 名前開始文字 | |
| \I | [^\i] | 名前開始文字以外 |
| \c | 名前文字 | |
| \C | [^\c] | 名前文字以外 |
| \d | \p{Nd} | 数字 |
| \D | [^\d] | 数字以外 |
| \w | [#x0000-#x10FFFF]-[\p{P}\p{Z}\p{C}] | 句読点(punctuation)分離子(separator) およびその他(other)のカテゴリーを除くすべての文字 |
| \W | [^\w] | 句読点(punctuation)分離子(separator) およびその他(other)のカテゴリーの文字 |
注)空白記号(white space)とは、半角スペース(space)、タブ(tab)、改行文字(line feed)、復帰文字(carriage return)のことです。
●エスケープ表現
正規表現で意味を持つ記号を指定する場合は「\」を使ってエスケープします。「\」自体を指定したいときもエスケープする必要があります(表6参照)。
<表6:エスケープの書き方>|
正規表現
|
特殊文字
|
正規表現
|
特殊文字
|
| \n | 改行文字 (#xA) | \r | 復帰文字 (#xD) |
| \t | タブ (#x9) | \\ | \ |
| \| | | | \. | . |
| \- | - | \^ | ^ |
| \? | ? | \* | * |
| \+ | + | \{ | { |
| \} | } | \( | ( |
| \) | ) | \[ | [ |
| \] | ] |
●文字参照
この他、"&#"10進数";"や"&#x"16進数";"という形式の文字参照を使って文字候補指定を行うこともできます。これは基本的に他の文字候補指定と同様に使用できますが、前述の範囲指定においては、"1-9 というような文字参照の使用はできません。
●OR指定("|")とグループ化("(……)")
"|"を使えば、これまでに説明したパターンのいずれかを使用するというOR指定の意味になります。
| OR指定 正規表現 "|" 正規表現 "|" 正規表現.... |
また、"(….)"を使ってグループ化することによって、様々な正規表現を書くことができます。
| 括弧による正規表現のグループ化指定 "(" 正規表現 ")" |
さて、今回は、みなさんにデータ型の達人になっていただきました。次回は名前空間について説明します。お楽しみに。
>>次の記事「名前空間」について


