Private/Split-DiffToken.ps1

#Requires -Version 5.1

function Split-DiffToken {
    <#
    .SYNOPSIS
        1 行を、行内比較の単位(トークン)へ分割する。
    .DESCRIPTION
        英数字とアンダースコアの連続を 1 つのトークンとし、それ以外の文字は
        1 文字ずつ独立したトークンにします。トークンを連結すると元の文字列に一致します。
    .PARAMETER Text
        分割する 1 行。空文字も受け取ります。
    .OUTPUTS
        [string[]] トークンの配列。Text が空文字なら空配列。
    .EXAMPLE
        Split-DiffToken -Text 'varying(100),'
        # 'varying' / '(' / '100' / ')' / ','
    .EXAMPLE
        Split-DiffToken -Text '2026-08-17'
        # '2026' / '-' / '08' / '-' / '17'
    #>

    [CmdletBinding()]
    [OutputType([string[]])]
    param(
        [Parameter(Mandatory)] [AllowEmptyString()] [string]$Text
    )

    if ($Text.Length -eq 0) { return [string[]]@() }

    # [A-Za-z0-9_] だけを語の構成文字とする。Char.IsLetterOrDigit では日本語も語に含まれ、
    # 長い日本語の文字列が 1 トークンになって、変更箇所を示せなくなる。
    # 記号を 1 文字ずつのトークンにするのは、括弧やハイフンをまたぐ変更を、その部分だけ示すため。
    # 1 文字ずつ判定する PowerShell のループは遅いため、正規表現で分割する。
    # Regex.Split の結果を -cne '' で絞り込む方法は、カルチャーに依存する比較でソフトハイフンなども除くため使わない。
    return [string[]]([regex]::Matches($Text, '[A-Za-z0-9_]+|[\s\S]').Value)
}