VBScript strnatcmp 関数

“自然順”アルゴリズムにより文字列比較を行う


Function strnatcmp( str1, str2 )

    Dim array1,array2
    array1 = strnatcmp_helper(str1)
    array2 = strnatcmp_helper(str2)

    Dim intlen,text,result,r
    intlen = uBound(array1)
    text   = true

    result = -1
    r      = 0

    if intlen > uBound(array2) Then
        intlen = uBound(array2)
        result = 1
    End If

    Dim i
    strnatcmp = false
    For i = 0 to intlen
        If not isNumeric( array1(i) ) Then
            If Not isNumeric( array2(i) ) Then
                text = true

                r = strcmp(array1(i),array2(i))
                If r <> 0 Then
                    strnatcmp = r
                End If

            ElseIf text Then
                strnatcmp = 1
            Else
                strnatcmp = 1
            End If

        ElseIf not isNumeric( array2(i) ) Then
            If text Then
                strnatcmp = -1
            Else
                strnatcmp = 1
            End If
        Else
            If text Then
                r = array1(i) - array2(i)
                If r <> 0 Then
                    strnatcmp = r
                End If
            Else
                r = strcmp(Cstr( array1(i) ),Cstr( array2(i) ) )
                If r <> 0 Then
                    strnatcmp = r
                End If
            End If

            text = false
        End If

        if [!==](strnatcmp,false) Then Exit Function
    Next

    strnatcmp = result

End Function

Function strnatcmp_helper(str)

    Dim result
    Dim buffer : buffer = "
    Dim strChr : strChr = "
    Dim text   : text   = true

    Dim i
    For i = 1 to len(str)
        strChr = Mid(str,i,1)

        If preg_match("/[0-9]/i",strChr,",",") Then
            If text Then
                If len( buffer ) > 0 Then
                    [] result, buffer
                    buffer = "
                End If

                text = false
            End If
            buffer  = buffer & strChr
        ElseIf text = false and strChr = "." and i < (len( str )-1) Then
            If preg_match("/[0-9]/",Mid(str,i+1,1),",",") Then
                [] result, buffer
                buffer = "
            End If
        Else
            If text = false Then
                If len( buffer ) > 0 Then
                    [] result , intval(buffer)
                    buffer = "
                End If
                text = true
            End If
            buffer = buffer & strChr
        End If
    Next

    If len( buffer ) > 0 Then
        if text Then
            [] result, buffer
        Else
            [] result, intval(buffer)
        End If
    End If

    strnatcmp_helper = result
End Function

引数

str1 = string 最初の文字列。
str2 = string 次の文字列。

戻り値

他の文字列比較関数と同様に、この関数は、 str1 が str2 より小さいに場合に < 0、str1 が str2 より大きい場合に > 0 、等しい場合に 0 を返します。

処理

・この関数は、人間が行うような手法でアルファベットまたは数字の 文字列の順序を比較するアルゴリズムを実装します。この手法は、”自然順” と言われます。
・この比較は、大文字小文字を区別することに注意してください。
*****************************

その他の PHP strings 関数