数字の正規表現(\d)の環境による動作の違い

正規表現

目次

「\d」は数字1文字を表す正規表現です。

半角数字については、どの環境においてもこれで検索を行うことがきます。

しかし、「\d」という正規表現が全角数字を含むかどうかは環境によりことなります。

今回は環境ごと、プログラミング言語ごとで「\d」が全角を含むかどうかを調査しました。

結論

テキストエディタ

テキストエディタでは以下のような結果になりました。

全角を含む全角を含まない
サクラエディタ
Visual Studio Code
Visual Studio
Eclipse

プログラミング言語

プログラミング言語は以下のような結果になりました。
(標準ライブラリのみを使用しています。)

全角を含む全角を含まない
Java
JavaScript
C#
Python

検証

では上記の結果を検証していきましょう。

テキストエディタ

サクラエディタ

全角数字が黄色くなっています。
サクラエディタでは全角数字も検索にひっかかることが確認できました。

Visual Sudio Code

半角数字は検索にひっかかっていますが、全角数字はひっかかっていません。
VSCodeでは「\d」が全角を含まないことを確認できます。

Visual Studio (2019)

半角数字も全角数字も背景が赤色になり、検索に引っかかっていることが確認できます。

そうです。まさかのVSCodeとVisual Studioで正規表現の検索結果が変わってくるのです。

Eclipse

全角数字にマッチせずに半角「0」にマッチしました。

Eclipseでは全角数字にマッチしないことが確認できました。

プログラミング言語

Java

以下のプログラムで検証します。

public class Num {
	public static void main(String... args) {

		String aaa = "1";
		String bbb = "1";

		System.out.println("aaa " + aaa.replaceAll("\\d", "2"));   // aaa 2
		System.out.println("bbb " + bbb.replaceAll("\\d", "2"));  // bbb 1
	}
}

変数「aaa」には半角の「1」を、
変数「bbb」には全角の「1」を代入します。

StringクラスのreplaceAllメソッドを使用して、それぞれの数字を1⇒2、1⇒2に置換するよう試みます。
使用する正規表現は「/d」です。

つまり、「\d」にマッチすれば、全角であろうが半角であろうが、2に切り替わるというプログラムです。

もし「\d」に引っかからない場合は、置換が行われず、1または1のまま、コンソールに出力されます。

それでは、実際に実行してみます。

赤く囲んだ箇所が実行結果の出力です。

一行目に「aaa 2」と出力されています。
つまりこれは、aaaに代入されていた「1」という値が正規表現「\d」にマッチして、9行目の処理内で、「2」に変換されたことを意味します。半角数字は「\d」にマッチするということです。

一方2行目には「bbb 1」が出力されています。これは7行目で定義したbbbの値がそのまま出力されています。

もし10行目の処理で全角数字「1」が、正規表現「\d」にマッチする場合、「1」から「2」に変換されるのですが、変換されなかったということです。

つまり、Javaにおいては全角数字は「\d」にマッチしないということが確認できます。

JavaScript

JavaScriptは以下のコードで確認します。

<script>
    var aaa = '1';
    var bbb = '1';
    console.log(`aaa, ${aaa.replace(/\d/, '2')}`)
    console.log(`bbb, ${bbb.replace(/\d/, '2')}`)
</script>

さきほどのJavaの処理をJavaScriptに書き直してみました。

さっそく実行結果を確認します。Google Chromeにて、このhtmlを開いてみます。

JavaScriptでもJavaと同様の実行結果になりました。

aaaについては「2」に変換されましたが、bbbについては「1」のままです。

つまり、JavaScriptでは正規表現「\d」は全角数字にマッチしないことが確認できます。

C#

C#は以下のコードで確認します。

    class Program
    {
        static void Main(string[] args)
        {
            var aaa = "1";
            var bbb = "1";

            Console.WriteLine($"aaa, {Regex.Replace(aaa, @"\d", "2")}");
            Console.WriteLine($"bbb, {Regex.Replace(bbb, @"\d", "2")}");
        }
    }

今までにご紹介したコードをC#向けに書き直しました。

さっそく実行してみます。

今度はaaaもbbbも2,2に置換されました。

つまり、C#では正規表現「\d」は半角数字にも全角数字にもマッチすることが確認できます。

Python

Pythonは以下のコードで検証します。(num.py)

import re


pattern = re.compile(r'\d')

aaa = '1'
bbb = '1'

print(f'aaa, {pattern.sub("2", aaa)}')
print(f'bbb, {pattern.sub("2", bbb)}')

今までにご紹介したコードをC#向けに書き直しました。

さっそく実行してみます。

Pythonにおいても、aaa,bbb共に2,2に置換されました。

つまり、Pythonでは正規表現「\d」は半角数字にも全角数字にもマッチすることが確認できます。

まとめ

今回は各テキストエディタ、プログラミング言語における正規表現「\d」の動作の違いについてご説明しました。

各テキストエディタ、プログラミング言語で導入されている正規表現エンジンが異なるため、このような動作の違いが生じます。(サクラエディタの場合はbregoning.dll Ver 4.20 with Onigmo 6.2.0)

読者様の研究のご参考になれば幸いです。

正規表現についての別記事についてもご覧ください!

★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方

最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法

環境による「\d」の動作の違いについて検証

★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法

CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法

また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!

正規表現入門 作業効率アップに役立つ38個の方法

コメント

タイトルとURLをコピーしました