Go言語で与えられた入力文字列が有効なMACアドレスの形式を満たしているかどうかを判断するIsMacAddressを作ってみた

---
<font color="red">Go</font>言語で与えられた入力文字列が有効なMACアドレスの形式を満たしているかどうかを判断するIsMacAddressを作ってみた
---

**Happy set**

「ｷｪｪｪｪｪｪｱｧｧｧｧｧｧｼｬｧﾍﾞｯﾀｧｧｧｧｧｧｧ!!!」

「マタシャベッタァ!!!!」

「ﾊｯﾋﾟｨｨﾃﾞｪｪｳﾒﾂｸｼｨｨﾃｪｪｴ!!!」

「ﾚｽﾄｲﾝﾋﾟｨｨｨｯｯｽﾏﾃﾞｲｺｳｾﾞ!!」

「ｲﾂｶﾐﾀｧｧｧ??!ｼﾞｺﾞｸﾓｲｲﾄｺﾛｯｯｵｫｫｩ!!」

「ｱｲｫｦｦｦﾊﾞﾗﾏｲﾃｪｴｨｨｨｲｴｴ!!!!!」

<br>

**目次**
- [1. MACアドレスとは](#1-macアドレスとは)
- [2. コード例と実行例](#2-コード例と実行例)
- [3. おわりに](#3-おわりに)


## 1. MACアドレスとは

　MACアドレス（Media Access Control Address）とは、ネットワーク内のデバイスを一意に識別するために使用される固有の識別子です。
 
　MACアドレスは通常、6つの2桁の16進数がコロン（:）で区切られた形式（例: 00:1A:2B:3C:4D:5E）で表されます。

　また、ハードウェア製造時にネットワークインターフェースカード（NIC）に永続的に割り当てられております。
 
　このアドレスは、物理的なネットワークセグメント内でデバイス間のデータ転送を管理する際に使用され、イーサネットやWi-Fiなどの多くの種類のネットワークで利用されます。

> 参考
 [macアドレス Wikipedia](https://ja.m.wikipedia.org/wiki/MAC%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)

## 2. コード例と実行例

以下は、与えられた文字列が、MACアドレスかどうかをチェックする関数のコード例です。

<font color="low blue">**コード例**</font>

```go
package main

import (
    "regexp"
)

// IsMacAddress は入力された文字列がMACアドレスの形式に一致するかどうかを判断します。
func IsMacAddress(input string) bool {
    // MACアドレスの正規表現パターン
    macAddressPattern := `^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$`
    re := regexp.MustCompile(macAddressPattern)

    return re.MatchString(input)
}
```

ここで使っているのが正規表現、と呼ばれるものです。

<font color="green">**正規表現**</font>(Regular Expression)

　正規表現は、文字列の検索、置換、解析などを行うための強力なツールです。
 
 特定のパターンに一致する文字列を記述するための方法です。
 
 　この場合、MACアドレスが特定のフォーマットに従っているかを検証するために使用されています。


<font color="low blue">**今回使われている正規表現パターン**</font>

```
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
```
- `^` : 文字列の開始を意味します。

- `([0-9A-Fa-f]{2}[:-]){5} : `この部分は、2桁の16進数（`0-9`、`A-F`、`a-f`の範囲）がコロン(`:`)またはハイフン(`-`)で5回繰り返されることを表します。`{2}`は2文字の16進数を意味し、`{5}`はそのパターンが5回繰り返されることを意味します。

- `([0-9A-Fa-f]{2})` : 文字列の最後にある2桁の16進数を表します。

- `$` : 文字列の終了を意味します。

<br>

- `regexp.MustCompile` : この関数は、指定された正規表現パターンから、正規表現オブジェクト（re）をコンパイルします。このオブジェクトは、その後の操作で使用されます。`MustCompile`は、パターンが無効な場合にパニック（実行時エラー）を発生させるため、通常は静的なパターンで使用されます。

<br>

- `re.MatchString(input)` : これは、コンパイルされた正規表現オブジェクトreを使って、入力された文字列`input`が正規表現パターンに一致するかどうかをチェックします。一致する場合は`true`を、そうでない場合は`false`を返します。


　因みに`regexp`は「`Regular Expression`(正規表現)」の略です。

> 参考
[正規表現Wikipedia](https://ja.m.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)

<font color="low blue">**実行例例**</font>

```go
package main

import (
    "fmt"
    "regexp"
)

// IsMacAddress function to check if the input is a valid MAC address
func IsMacAddress(input string) bool {
    macAddressPattern := `^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$`
    re := regexp.MustCompile(macAddressPattern)

    return re.MatchString(input)
}

func main() {
    testAddresses := []string{
        "00:1A:2B:3C:4D:5E", // Valid MAC address
        "00-1A-2B-3C-4D-5E", // Valid MAC address with hyphens
        "00:1A:2B:3C:4D:5G", // Invalid MAC address (contains 'G')
        "001A:2B:3C:4D:5E",  // Invalid MAC address (missing a pair)
        "",                  // Invalid MAC address (empty string)
    }

    for _, address := range testAddresses {
        fmt.Printf("Testing '%s': %t\n", address, IsMacAddress(address))
    }
}
```

```sh
Testing '00:1A:2B:3C:4D:5E': true
Testing '00-1A-2B-3C-4D-5E': true
Testing '00:1A:2B:3C:4D:5G': false
Testing '001A:2B:3C:4D:5E': false
Testing '': false
```

## 3. おわりに
　正規表現はまだまだあるらしく、今後も勉強していきたいです。

　macのパソコンを使っているので、MACアドレスには謎の親近があります(関係ない)。

　人間にも、身体のどこかに固有の番号が刻まれているかも。