
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。文字列に含まれているアルファベット以外のすべての文字を削除する方法はありますか。
-- CD

CD さん、こんにちは。通常は Scripting Guys は特別扱いをしません、読者の皆さんと送られてきたすべての質問は、まったく平等に扱っています (ええまあ、厳密に言えば、ほとんどの場合、送られてきたすべての質問も読者の皆さん全員も同じように無視しているという意味ですが、少なくとも皆さんを平等に扱っているのには変わりないですよね)。
ただし、今回は例外です。CD さん、これはとても良い質問です。今まで送られてきた中で最もすばらしい質問の 1 つです。文字列に含まれるアルファベット以外のすべての文字を削除するスクリプトを記述する方法についての質問をお送りいただき、本当にありがとうございます。これは実にすばらしい質問です。
いずれにせよ、最も良い方法は・・・。何ですって。この質問がすばらしいのは、多くのシステム管理スクリプト記述者たちが抱える悩みを解消するからか、ですって。いえ。実を言うと、似たような趣旨の質問が送られてきましたが、文字列に含まれるアルファベット以外のすべての文字を削除する必要がある人がどのくらいいるのかよくわかりません。では、この質問がすばらしいのは、システム管理スクリプトに関する、まだ普及していない重要な概念について説明する機会が Scripting Guys に与えられるからか、ですって。ええ、そうかもしれません。でもそれは、"私たちが" この質問をすばらしいと思った理由ではありません。いいえ、私たちがこの質問をすばらしいと思ったのは、ほんの数分で、しかも、たった数行のコードで答えられるとわかっていたからです。つまり、今日のコラムをさっさと終わらせて、皆さんが本当に関心を持っている話題に移ることができるということです。それは、今夜行われるワシントン大学の Washington Huskies 対シラキューズ大学の Syracuse Orange のカレッジ フットボールの試合です。
注 : シラキューズ大学スポーツ公式サイト (英語) にアクセスすると、バレーボール選手の Mindy Stanislovaitis の好きな果物がイチゴで、好きなスーパーヒーローがスパイダーマンだということがわかります。また、今夜の開幕初戦では、どうやら Orange は、Washington Huskies と対戦するのではなく、Washington Post と対戦するらしい、ということもわかります。もちろん、Syracuse Orange のように、過去 2 年の成績が 5 勝 18 敗であれば、別のカレッジ フットボールのチームよりも新聞と対戦してシーズンを開幕する方が理にかなっているかもしれません。 |
とにかく、キックオフまで数時間しかないので、今日の質問 (ところで、これはとても良い質問です) の回答に取り掛かった方がいいですね。
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.Pattern = "[^A-Za-z]"
strSearchString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz!@#$%&*(_+"
strSearchString = objRegEx.Replace(strSearchString, "")
Wscript.Echo strSearchString
どうですか。これは早くて簡単だと言ったでしょう。
この処理を実行する方法は他にもありますが、(私にとって) 最も簡単な方法は正規表現を使用することです。そのため、このスクリプトでは、まず次のコード行を実行します。このコード行では VBScript の正規表現オブジェクト (VBScript.RegExp) のインスタンスを作成します。
Set objRegEx = CreateObject("VBScript.RegExp")
正規表現オブジェクトを作成したら、オブジェクトの 2 つの重要なプロパティを設定します。まず、Global プロパティを True に設定します。この処理を行うのは、Replace メソッドを実行したときに、正規表現で文字列値全体が検索されるようにするためです。Global プロパティを True に設定しなかった場合はどうなるでしょうか。その場合は、正規表現が目的のテキストの最初のインスタンス (つまり、最初のアルファベットではない文字) を見つけたところで停止します。確かに、文字列に含まれているアルファベットではない文字が少なくとも 1 つあるかどうかだけを知る必要がある、という場合もあります。ただし、今回の質問はこれに該当しません。
次に、正規表現の Pattern プロパティ (つまり検索するテキスト) を定義する必要があります。これを行うのが次のコードです。
objRegEx.Pattern = "[^A-Za-z]"
正規表現を使用する際の秘訣は、意味がわからない構文を怖がらないことです。[^A-Za-z] のような構文を見て、「ええと、この構文の利用対象者はわからないけど、私は間違いなく対象外だろう」と考える人が多いようです。しかしこれは、実はとても簡単なステートメントです。正規表現を使用すると、検索する文字を角かっこで囲むだけでさまざまな文字を検索することができます。A 〜 Z (大文字) のすべての文字を検索する必要がある場合は、[A-Z] という構文を使用します。小文字の a 〜 z のすべての文字を検索する場合も問題ありません。その場合は、[a-z] という構文を使用します。また、大文字か小文字のどちらかを検索する必要がある場合は、1 つの方法として、[A-Za-z] のように両方の文字範囲を 1 つの角かっこに入れた構文を使用できます。
前述のとおり、単純で簡単です。
では、キャレット記号 (^) は、どういう意味があるのでしょうか。文字範囲と共にキャレットが指定されている場合、そのキャレットは「〜でない」という意味になります。では、[^A-Za-z] という構文はどういう意味でしょうか。これは、A 〜 Z の範囲または a 〜 z の範囲にない文字を検索するという意味です。つまり、アルファベット以外のすべての文字を検索するということです。
偶然にも、これは私たちが検索する必要があるものとまったく同じです。
まさかと思うでしょうが、これ以降の処理は、さらに簡単です。まず、strSearchString という名前の変数に値を代入します。この値にはアルファベットではない文字が多く含まれていることに注意してください。
strSearchString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz!@#$%&*(_+"
その後、Replace メソッドを呼び出して、このメソッドに 2 つのパラメータを渡します。1 つ目は検索する必要のある値 (strSearchString 変数)、2 つ目は置換テキストです。もちろん、この場合、アルファベット以外の文字を空白文字と置き換える必要があるので、空の文字列 ("") を置換テキストとして使用します。
strSearchString = objRegEx.Replace(strSearchString, "")
このコードにより strSearchString 変数の値に含まれているアルファベット以外のすべての文字が削除されます (つまり、アルファベット以外の文字が検出され、空白文字と置き換えられます)。では、このコード行を使用して、strSearchString 変数の値に含まれるアルファベット以外のすべての文字を削除できるのでしょうか。では、strSearchString 変数の値をエコー バックしたときにどうなるか見てみましょう。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
いやあ、驚きましたね。
ご参考までに、同じ方法を使用してテキスト ファイルに含まれているアルファベット以外のすべての文字置き換えることができます。実際に、この処理を行うサンプル スクリプトを急いで作成しました。このスクリプトでは、Pattern プロパティの値に \n\r を追加したことに注意してください。これは、改行文字 (\n) と復帰文字 (\r) を検索範囲から除く必要があることをスクリプトに指示しています。つまり、スクリプトにより、テキスト ファイルから改行が削除されることはありません。改行を残す必要がない場合は、Pattern プロパティの値から \n\r を削除します。
難しい話 (つまり説明) は抜きにして、次にこのスクリプトを示します。
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
strSearchString = objFile.ReadAll
objFile.Close
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.Pattern = "[^A-Za-z\n\r]"
strSearchString = objRegEx.Replace(strSearchString, "")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForWriting)
objFile.WriteLine strSearchString
objFile.Close
皆さんに、ちょっとしたおまけのスクリプトを紹介します。言うまでもありませんが、カレッジ フットボールのシーズンが近づいているので、このコラムを執筆している Scripting Guy は浮かれています。珍しい限りです。
そういえば、この Scripting Guy が次のシーズンについて思い違いをしていないということをお知らせしておきます。彼は、長い間シーズン チケットを購入しているので、ワシントン大学のフットボールについて他の人と同じくらいの知識はあります (今シーズン、彼らが、昨年大学フットボール選抜試合に出場した 9 チームと試合をするという国内で一番過酷なスケジュールをこなすことも知っています)。しかし、試合が始まるまでは、全チームの記録が無敗で、全チームにナショナル チャンピオンになるチャンスがあります。これは、スポーツのすばらしいところですよね。
Washington Post と対戦してシーズンを開幕するチームの場合は特にそうです。