以前、VB系開発者に正規表現が知られていない事を書いたのですが、解説書や参考資料が、Unix系とMS系の差に言及していないのも一因だと感じました。
「正規表現云々」の本の多くは、Perl/awk/mule/editor等非MS系を対象に書かれているため、MS-Regex方言と一致しない部分か幾つか存在します。
たとえば Posixブラケット表現 [:alnum:] などは使えません。文字クラス表現のp{xxx}は使えますが、キーワードが異なります。
\p{Han} は漢字にマッチするようですが、MS-Regexでは \p{IsCJKUnifiedIdeographs}になります。 Graph Char扱いなんですね。
双方の違いを理解しないと、参考書を読み下せません。これが障壁になって普及しないのかもしれません。
理解しない開発者に責があるとはいうものの、もう少し積極的に普及するような資料の作成を望みたいです。
文字クラスの分類をみていると面白いです : http://msdn2.microsoft.com/ja-jp/library/20bw873z(VS.80).aspx
文字クラスは 0u0000~0uFFFFまでのすべてのコードが分類化されています。
クラスに合致する文字の抽出サンプルを作って見ました。
Dim sb As New StringBuilder(2048)
For i As Integer = 1 To UInt16.MaxValue
sb.Append(ChrW(i))
Next
これで sbには表現可能な文字がUnicodeで格納されます。
Dim pat as string ="\p{IsHiragana}" ' <= {xx} xxを変化させる
Dim mts As MatchCollection = Nothing
mts = Regex.Matches(sb.ToString, pat, RegexOptions.None)
Dim sbz As New StringBuilder(1024)
For Each mat As Match In mts
sbz.Append(mat.Value)
Next
Console.Write("Pattern " + pat + " :要素数[" + mts.Count.ToString + "]:")
Console.WriteLine(sbz.ToString)
patに適切な文字クラス名をセットして実行すると該当する文字が得られます。
Pattern="IsHiragana" :要素数[96]:?ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんヴ??????゛゜ゝゞ?
Pattern="IsKatakana" :要素数[96]:?ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ????・ーヽヾ?
"ひらがな"と"カタカナ"では数は同じだが、表現文字が事なる上に対になっていない。最後に意味不明な文字も付いている。
"カタカナ"とは異なる分類で、こんなのがあります。知らないと嵌りそう。
Pattern="IsKatakanaPhoneticExtensions" :要素数[16]:????????????????
知らなかったのですが、こんな字もあります。カレンダー用や出版用なのでしょうか。
Pattern="IsEnclosedCJKLettersandMonths" :要素数[256]:?????????????????????????????????????????????????㈱㈲??????㈹??????????????????????????????????????????????????????????????????????????????????????????????????????????㊤㊥㊦㊧㊨???????????????????????????????????????????????????????????????????????????????????????
Pattern="IsCJKCompatibility" :要素数[256]:???㌃?????????㌍??????㌔???㌘?????????㌢㌣??㌦㌧???㌫??????????㌶????㌻?????????????㍉㍊??㍍???㍑?????㍗???????????????????????????????????㍻㍼㍽㍾???????????????㎎㎏????????????㎜㎝㎞??㎡??????????????????????????????????㏄????????㏍??????????????????????????????????????????????????
Patter IsHalfwidthandFullwidthForms :要素数[240]:?!"#$%&'()*+,-./
半角カタカナはIsHalfwidthandFullwidthFormsに登場します。
Pattern=IsHalfwidthandFullwidthForms :要素数[240]:#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~??。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
文字クラスの分類基準がいまいちスッキリしませんが、Code-Pageとの兼ね合いもあり、パターンは増加するのでしょうね。
文字列置換は強力で、 s/xx/yy/g の単純置換だけででなく, regex.Replace(text, pattern,delegate) の形式で、置換処理を独立したメソッドで記述できるので自由度が大きいです。
Regex処理を使わなくても文字列処理はできますが、パターン化できる部分は積極的にRegex処理化していきたいと思ってます。
難点は、SQL文と同様に、凝ったパターンを作ると、後日自分ても意味不明になるので、凝りずぎは要注意です。
Code修正しました
Patter IsCJKCompatibility : ㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿
Patter IsKatakanaPhoneticExtensions : ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
Patter IsEnclosedAlphanumerics : ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿
どうにか表示できました。&#xxxで記述しないとダメなのですね。