COMPANY

BLOGS

  • user warning: Unknown column 'u.signature_format' in 'field list' query: SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data, c.thread, c.status FROM comments c INNER JOIN users u ON c.uid = u.uid WHERE c.nid = 14390 AND c.status = 0 ORDER BY c.cid LIMIT 0, 50 in /var/www/www.4d.com/docs/modules/comment/comment.module on line 991.
  • warning: file_get_contents(http://www.telize.com/geoip/54.146.59.207) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/www.4d.com/docs/includes/common.inc(1762) : eval()'d code on line 4.

半角文字に合致する正規表現

10.05.2010
by Keisuke Miyako

 

Match regexで使用できる正規表現は, Unicodeテクニカルスタンダート#18に準拠しており, 文字をプロパティで調べることができます。その場合, 正規表現はPOSIXシンタックスとPerlシンタックスどちらかで記述します。プロパティには, 値がバイナリのもの, 列挙型のもの, および文字列のものが存在します。たとえば, [:Katakana:]はバイナリプロパティのPerlシンタックスであり, すべてのカタカナ文字(全角および半角)にマッチします。\p{East Asian Width=Halfwidth}はストリングプロパティのPOSIXシンタックスであり, すべての半角文字にマッチします。文字のプロパティに通じているならば, いっそう洗練された正規表現を組み立てることができるので有利です。

 

http://www.unicode.org/reports/tr18/

 

スクリプト名

Unicodeの文字は, U+0000からU+10FFFFまでのコードポイントが, スクリプト等により, 198のブロックに区分されています。ブロック名のリストとそれぞれのカバーしている範囲は, 下記のURLで公開されています。

 

http://unicode.org/Public/UNIDATA/Blocks.txt

 

ブロック名は, 文字コードの範囲でUnicodeを区分したものですが, 特定のスクリプトが複数のブロックに分散している場合もあります。たとえば, Katakanaというブロック名は, U+30A0からU+30FFまでを指していますが, これ以外にもカタカナ文字(たとえば半角)も存在します。スクリプト名はUnicodeテクニカルスタンダート付録#24で定められており, すべての文字は, スクリプト名が割り当てられています。

 

http://www.unicode.org/reports/tr24/

http://unicode.org/Public/UNIDATA/Scripts.txt

 
正規表現でスクリプト名を指定するには下記のように記述します。スクリプト名の途中にスペースあるいはアンダースコアをいくつ挿入しても構いません。また大文字と小文字は無視されます。
 
$string:="アイウエオカキクケコ"
$regex:="\\p{Katakana}+"`または"[:Katakana:]+"または"[:script=Katakana:]+"
$test:=Match regex($regex;$string)
 
東アジア文字の幅
東アジア文字の幅プロパティは, Unicodeテクニカルスタンダート付録#11で定められており, すべての文字は, その幅がAmbiguous, Fullwidth, Halfwidth, Narrow, Wide, またはNeutral (=東アジア文字ではない) いずれかの値が割り当てられています。等幅フォントで1/2の文字(いわゆる半角)はNarrowまたはHalfwidthであり, その他の文字(いわゆる全角)はWideまたはFullwidthです。東アジア文字の幅に関する詳細は, 下記のURLで公開されています。
 
 
正規表現で東アジア文字の幅を指定するには下記のように記述します。
 
$string:="アイウエオ"
$regex:="\\p{East Asian Width=Halfwidth}+" `または"[:East Asian Width=Halfwidth:]+"
$test:=Match regex($regex;$string)

 

その他のプロパティ

Unicodeのプロパティは, Unicodeテクニカルスタンダート付録#44で定められており, 文字ごとに定義されたプロパティの一覧は, UnicodeData.txtで公開されています。

 

http://www.unicode.org/reports/tr44/

http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

 
16進数

16進数の文字列表記は一般に[0-9a-f]のようなUnicodeSetで記述されますが, これをバイナリプロパティのHex_DigitまたはASCII_Hex_Digitでマッチすることもできます。

 

$string:="4D65"
$regex:="\\p{ASCII_Hex_Digit}+" `または"[:ASCII_Hex_Digit:]+"
$test:=Match regex($regex;$string)

$string:="4D65"`全角
$regex:="\\p{Hex_Digit}+" `または"[:Hex_Digit:]+"
$test:=Match regex($regex;$string)

 

漢字

Unicodeでは, 漢字を特定の言語ではなく, CJK(中国語, 日本語, 韓国語, ベトナム語)と定義しています。そのような文字は, バイナリプロパティのIdeographic, Unified_Ideographなどでマッチすることができます。

 

$string:="漢字"
$regex:="\\p{Ideographic}+" `または"[:Ideographic:]+"
$test:=Match regex($regex;$string)