0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M_String:内部処理

Last updated at Posted at 2025-04-22

パターン作成

RegExp用パターンを作成する

検索パターン作成

'------------------------------------------------------------------------------
' パターン作成
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 検索パターン作成
'------------------------------------------------------------------------------
Private Function PF_String_ReturnSearchPattern( _
        ByVal aSearch As String, ByVal aSrchSpec As E_STRING_SPEC) As String
    Dim wkRtn As String
    
    'エスケープシーケンス変換(必要分のみ)
    wkRtn = PF_String_ReturnChangeEscSeq(aSearch, Array("\", "{", "}", "(", ")", "[", "]"))
    
    '開始側パターン設定
    If M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_POS_START) = True Then
        wkRtn = F_String_ReturnAdd(wkRtn, "^", aAddSpec:=E_STRING_SPEC_POS_START)
    End If
            
    '終了側パターン設定
    If M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_POS_END) = True Then
        wkRtn = F_String_ReturnAdd(wkRtn, "$", aExcluded:="\$")
    End If
    
    PF_String_ReturnSearchPattern = wkRtn
End Function

' エスケープシーケンス置換
Private Function PF_String_ReturnChangeEscSeq( _
        ByVal aSearch As String, _
        ByVal aEscSeqAry As Variant) As String
    Dim wkRtn As String
    Dim wkTmp As Variant
    
    '初期化
    wkRtn = aSearch
    
    'エスケープシーケンスに置き換え
    For Each wkTmp In aEscSeqAry
        wkRtn = Replace(wkRtn, wkTmp, "\" & wkTmp)
    Next wkTmp
    
    '初期化
    PF_String_ReturnChangeEscSeq = wkRtn
End Function

チェックパターン作成

'------------------------------------------------------------------------------
' チェックパターン作成
'------------------------------------------------------------------------------
Private Function PF_String_ReturnCheckPattern( _
        ByVal aSrchPtn As String, ByVal aSrchSpec As E_STRING_SPEC, _
        ByVal aChkPtn As String, ByVal aChkSpec As E_STRING_SPEC) As String
    Dim wkRtn As String
    Dim wkPattern As String
    
    wkRtn = "(" & aSrchPtn & ")"
    
    '一致パターン追加ありの場合
    If aChkPtn <> "" And aChkSpec <> E_STRING_SPEC_NONE Then
        '開始側チェック指定あり、かつ開始側一致指定なしの場合、検索文字列開始側にチェックパターン追加
        If M_Common.F_CheckBitOn(aChkSpec, E_STRING_SPEC_MATCH_START) = True And _
                M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_MATCH_START) <> True Then
            wkRtn = aChkPtn & wkRtn
        End If
        '終端側チェック指定あり、かつ終端側一致指定なしの場合、検索文字列終端側にチェックパターン追加
        If M_Common.F_CheckBitOn(aChkSpec, E_STRING_SPEC_MATCH_END) = True And _
                M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_MATCH_END) <> True Then
            wkRtn = wkRtn & aChkPtn
        End If
    End If
    
    '開始側パターン設定
    If M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_POS_START) = True Then
        wkRtn = F_String_ReturnAdd(wkRtn, "^", aAddSpec:=E_STRING_SPEC_POS_START)
    End If
            
    '終了側パターン設定
    If M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_POS_END) = True Then
        wkRtn = F_String_ReturnAdd(wkRtn, "$", aExcluded:="\$")
    End If
    
    PF_String_ReturnCheckPattern = wkRtn
End Function

単語検索パターン作成

'------------------------------------------------------------------------------
' 単語検索パターン作成
'------------------------------------------------------------------------------
Private Function PF_String_ReturnCheckPatternWord( _
        ByVal aSrchPtn As String, ByVal aSrchSpec As E_STRING_SPEC, _
        ByVal aChkPtn As String, ByVal aChkSpec As E_STRING_SPEC) As String
    Dim wkRtn As String
    Dim wkTmpStr As String
    
    '中間検索指定ありの場合、中央検索指定
    If M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_MATCH_MID) = True Then
        wkRtn = PF_String_ReturnCheckPattern(aSrchPtn, aSrchSpec, aChkPtn, aChkSpec)
    End If
        
    '先頭検索指定または中間検索指定あり、かつパターン指定に終端ありの場合
    If M_Common.F_CheckBitOn(aSrchSpec, (E_STRING_SPEC_MATCH_START Or E_STRING_SPEC_MATCH_MID)) = True And _
            M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_MATCH_END) = True Then
        '開始位置一致確認を追加
        wkTmpStr = PF_String_ReturnCheckPattern(aSrchPtn, E_STRING_SPEC_MATCH_START, aChkPtn, E_STRING_SPEC_MATCH_END)
        wkRtn = F_String_ReturnAdd(wkRtn, wkTmpStr, aDlmt:="|")
    End If
        
    '終端検索指定または中間検索指定あり、かつパターン指定に先頭ありの場合
    If M_Common.F_CheckBitOn(aSrchSpec, (E_STRING_SPEC_MATCH_END Or E_STRING_SPEC_MATCH_MID)) = True And _
            M_Common.F_CheckBitOn(aSrchSpec, E_STRING_SPEC_MATCH_START) = True Then
        '終端位置一致確認を追加
        wkTmpStr = PF_String_ReturnCheckPattern(aSrchPtn, E_STRING_SPEC_MATCH_END, aChkPtn, E_STRING_SPEC_MATCH_START)
        wkRtn = F_String_ReturnAdd(wkRtn, wkTmpStr, aDlmt:="|")
    End If
    
    If wkRtn = "" Then
        wkRtn = aSrchPtn
    End If
    
    PF_String_ReturnCheckPatternWord = wkRtn
End Function

文字列調整

各種文字列関連の調整を実施する

終了位置調整

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 文字列調整
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 終了位置調整
'------------------------------------------------------------------------------
Private Function PF_String_GetPosEndAdjust( _
        ByRef aRtn As Long, _
        ByVal aLenMax As Long, _
        ByVal aSttPos As Long, _
        ByVal aLength As Long) As Boolean
    Dim wkRtn As Long: wkRtn = aRtn
    
    '終了位置が開始位置より小さい場合
    If wkRtn < aSttPos Then
        '長さ指定ありなら反映
        If aLength >= D_POS_START Then
            wkRtn = aSttPos + aLength - 1
        '長さ指定なしなら最大長反映
        Else
            wkRtn = aLenMax
        End If
    End If
    If wkRtn > aLenMax Then
        wkRtn = aLenMax
    End If
    
    If wkRtn >= D_POS_START Then
        aRtn = wkRtn
        PF_String_GetPosEndAdjust = True
    End If
End Function

文字列長調整

'------------------------------------------------------------------------------
' 文字列長調整
'------------------------------------------------------------------------------
Private Function PF_String_GetLengthAdjust( _
        ByRef aRtn As Long, _
        ByVal aLenMax As Long, _
        ByVal aSttPos As Long, _
        ByVal aEndPos As Long) As Boolean
    Dim wkRtn As Long: wkRtn = aRtn
    
    Dim wkLenMax As Long: wkLenMax = aLenMax - aSttPos + 1
    
    '文字列長さが範囲外の場合
    If wkRtn < D_POS_START Then
        '終了指定ありなら反映
        If aEndPos >= aSttPos Then
            wkRtn = aEndPos - aSttPos + 1
        '終了指定なしなら最大長反映
        Else
            wkRtn = wkLenMax
        End If
    End If
    If wkRtn > wkLenMax Then
        wkRtn = wkLenMax
    End If
    
    If wkRtn >= D_POS_START Then
        aRtn = wkRtn
        PF_String_GetLengthAdjust = True
    End If
End Function
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?