Tips

Match regexの使い方 - その2

日付2008/08/25
ID08-024
バージョン11
プラットフォームMac & Win

ICUの正規表現では、?, *?, ??など、代表的な正規表現のメタキャラクターがそのまま使用できます。一方、Unicode独特の概念であるプロパティ、コードポイント、グラフィームクラスターなどに基づくパターンマッチングにも対応しており、そのために特有のメタキャラクターがいくつか存在します。

?

直前の文字やメタキャラクターがひとつあればマッチし、なくてもマッチします。

例:

$Regex_t:="https?://(.+?)/"

$m:=Match regex($Regex_t"http://192.168.0.1";1;$Position_l;$Length_l)

"http://"でマッチし、"https://"でもマッチします。

*?

*のように直前の文字やメタキャラクターを0回以上マッチしますが、最小限の回数でマッチします。

例:

$Regex_t:="(.*)え"

$m:=Match regex($Regex_t"あいうえおあいうえお";1;$Position_l;$Length_l)

*は最大限マッチするので、2回目で最後の"え"までマッチします。

$Regex_t:="(.*?)え"

$m:=Match regex($Regex_t"あいうえおあいうえお";1;$Position_l;$Length_l)

*?は最小限マッチするので、最初の"え"までマッチします。

+?

+のように直前の文字やメタキャラクターを1回以上マッチしますが、最小限の回数でマッチします。

(?:...)

正規表現のパターンをグループしても、そのマッチ内容を後に参照する必要がなければ、(...)の代わりに(?:...)を使用することで効率を良くすることができます。(?:...)で括られたグループはキャプチャグループの数には含まれません。

\S

スペース(\s)以外のあらゆる文字でマッチします。たとえば"\s*(\S+)\s*"は前後のスペースを切り取ります。

\u____

4桁の16進数で指定したコードポイントのUnicodeでマッチします。Unicode最初の65536文字(Basic Multilingual Plane)だけが指定できます。

\U________

8桁の16進数で指定したコードポイントのUnicodeでマッチします。すべてのUnicodeが指定できます。

\p{}

特定のプロパティを有するUnicodeでマッチします。Unicodeでは、すべての文字がそれぞれひとつ以上のパラメータを持っています。たとえば"a"は文字であるのでL(Letter)というプロパティを持っており、かつ小文字であるのでLl(Lowercase Letter)というプロパティも持っています。同じように"あ"はL(Letter)およびLo(Other Letter)というプロパティの文字です。

\P{}

特定のプロパティを有しないUnicodeでマッチします。

\w

Unicodeに定義するワードキャラクター、つまりLl, Lu, Lt, Lo, Ndいずれかのプロパティを持つ文字にマッチします。英数字、ひらがな、漢字など一般的に単語を構成する文字はマッチしますが、「」や、。(プロパティ:P...Punctuation)?(プロパティ:Lm...Modifier Letter)「丸1」(プロパティ:No...Other Number)などはマッチしません。

\W

ワードキャラクターではないUnicodeでマッチします。

\X

グラフィームクラスターでマッチします。Unicodeには、直前に適切な文字があれば組み合わせでひとつの文字を構成するモディファイアが存在します。たとえば、日本語の濁点(\u3099)・半濁点(\u309A)は、直前の文字と組み合わせで(ふたつのコードポイントで)ひとつの文字を表現することができます。そのような文字は、それぞれのコードポイントが正規表現の.にマッチします。組み合わせの結果として作られる文字(グラフィームクラスター)は\Xでマッチします。

例:

$Text_t:="か"+Char(0x3099)+":"

$Regex_t:="(.):"

$m:=Match regex($Regex_t;$Text_t;1;$Position_l;$Length_l)

.は、組み合わせ文字の濁点(\u3099)でマッチします。

$Text_t:="か"+Char(0x3099)+":"

$Regex_t:="(\X):"

$m:=Match regex($Regex_t;$Text_t;1;$Position_l;$Length_l)

\Xは、"が"でマッチします。

コードポイントについて

http://unicode.org/glossary/

プロパティについて

http://www.icu-project.org/userguide/properties.html

グラフィームクラスターについて

http://www.unicode.org/unicode/reports/tr29/#Grapheme_Cluster_Boundaries