読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

.NET の正規表現で半角数字にマッチさせるには?

.NET

ネタ元はわんくま質問掲示板の No.50341
この記事の検証をしていて、ちょっと気になる動作が。

var str = @"1234567890あいうえお9876543210";
var result = Regex.Replace(str, @"\D", "");
Console.WriteLine(result);

を実行すると、

12345678909876543210

になります。(「 \d 」に全角数字がヒットしている)
上のコードは C# で書きましたが、 VB でやっても一緒です。
# .NET 3.5 SP1 で試した結果ですが、 .NET 4 RC でも動きは一緒だったので、恐らく .NET 4 RTM でも変わっていないハズ。
一方、 Perl 5.10.1 で同じ事をやると、

$str = '1234567890あいうえお9876543210';
$str =~ s/\D//g;
print $str;
123459098643210

となります。(「 \d 」は全角の数字にはヒットしません)
そもそも PCRE としては、基本的に「 \d 」は「 IsDigit 」であり「 [0-9] 」と等価であるべきなはず。
こう云う独自拡張は不要な混乱を招くからやめて欲しいです。。。
……で結局、表題を実現したい場合、

var str = @"1234567890あいうえお9876543210";
var result = Regex.Replace(str, @"[^0-9]", "");
Console.WriteLine(result);
123459098643210

としないとダメ。
# ( 17:12 修正)なぜか str.Replace(str,...) とか書いていたので Regex.Replace(str,...) に修正。