VB6では、Trim()関数は文字列の前後のスペースを削除します。文字列の両端からスペースだけでなくすべての空白(この場合はタブ)を削除する関数があるかどうか疑問に思っています。
組み込みの機能がないのは残念です。これが私が書いたものです。それはトリックをします。
Function TrimAllWhitespace(ByVal str As String)
str = Trim(str)
Do Until Not Left(str, 1) = Chr(9)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(9)
str = Trim(Left(str, Len(str) - 1))
Loop
TrimAllWhitespace = str
End Function
Trim
関数をReplace
関数と組み合わせる必要があります。
s = " ABC " & vbTab & " "
MsgBox Len(s)
MsgBox Len(Trim$(s))
s = Replace$(Trim$(s), vbTab, "")
MsgBox Len(s)
注:上記のコードは埋め込みタブも削除します。おそらく正規表現でこれを解決できますが、ここではループを介して端からのみスペース/タブをトリムする方法があります:
Dim s As String, char As String, trimmedString As String
Dim x As Integer
s = " " & vbTab & " ABC " & vbTab & "a " & vbTab
'// Trim all spaces/tabs from the beginning
For x = 1 To Len(s)
char = Mid$(s, x, 1)
If char = vbTab Or char = " " Then
Else
trimmedString = Mid$(s, x)
Exit For
End If
Next
'// Now do it from the end
For x = Len(trimmedString) To 1 Step -1
char = Mid$(trimmedString, x, 1)
If char = vbTab Or char = " " Then
Else
trimmedString = Left$(trimmedString, x)
Exit For
End If
Next
あなたはABC{space}{space}{tab}a
で終わるはずです
どうですか:
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" ( _
ByVal lpString As Long) As Long
Private Declare Function StrTrim Lib "shlwapi" Alias "StrTrimW" ( _
ByVal pszSource As Long, _
ByVal pszTrimChars As Long) As Long
Private Function TrimWS(ByVal Text As String) As String
'Unicode-safe.
Const WHITE_SPACE As String = " " & vbTab & vbCr & vbLf
If StrTrim(StrPtr(Text), StrPtr(WHITE_SPACE)) Then
TrimWS = Left$(Text, lstrlen(StrPtr(Text)))
Else
TrimWS = Text
End If
End Function
API呼び出しを定義するためにDeclare
の代わりにtypelibsを使用すると、それはさらに高速になります。
私はこの関数を使用します:
Private Function TrimAll(Text As String) As String
Const toRemove As String = " " & vbTab & vbCr & vbLf 'what to remove
Dim s As Long: s = 1
Dim e As Long: e = Len(Text)
Dim c As String
If e = 0 Then Exit Function 'zero len string
Do 'how many chars to skip on the left side
c = Mid(Text, s, 1)
If c = "" Or InStr(1, toRemove, c) = 0 Then Exit Do
s = s + 1
Loop
Do 'how many chars to skip on the right side
c = Mid(Text, e, 1)
If e = 1 Or InStr(1, toRemove, c) = 0 Then Exit Do
e = e - 1
Loop
TrimAll = Mid(Text, s, (e - s) + 1) 'return remaining text
End Function
使用法:
Debug.Print "|" & TrimAll("") & "|" 'prints ||
Debug.Print "|" & TrimAll(" ") & "|" 'prints ||
Debug.Print "|" & TrimAll("a") & "|" 'prints |a|
Debug.Print "|" & TrimAll("a ") & "|" 'prints |a|
Debug.Print "|" & TrimAll(" a") & "|" 'prints |a|
Debug.Print "|" & TrimAll(" a b ") & "|" 'prints |a b|
Debug.Print "|" & TrimAll(vbTab & " " & "Some " & vbCrLf & " text. " & vbCrLf & " ") & "|" 'prints |Some
text.|
削除する文字をtoRemove文字列に追加するだけです。
部分的にトリミングされた文字列を何度もコピーするのではなく、トリミングされた文字列の開始位置と終了位置を検索し、その部分のみを返します。
これも便利かもしれません、@ MathewHagemannの継続これは前後の空行を削除します
Public Function TrimAllWhitespace(ByVal str As String)
str = Trim(str)
Do Until Not Left(str, 1) = Chr(9)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(9)
str = Trim(Left(str, Len(str) - 1))
Loop
Do Until Not Left(str, 1) = Chr(13)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Left(str, 1) = Chr(10)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(10)
str = Trim(Left(str, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(13)
str = Trim(Left(str, Len(str) - 1))
Loop
TrimAllWhitespace = str
End Function
これは私が思いついたもので、トリミングされた文字列自体を返すか、トリミングされた文字列の長さを選択できます
モジュール内
'=========================================================
'this function lets get either the len of a string with spaces and tabs trimmed of
'or get the string itself with the spaces and tabs trimmed off
'=========================================================
Public Property Get eLen(sStr As String, Optional bTrimTabs As Boolean = True, Optional bReturnLen As Boolean = True) As Variant
'function which trims away spaces and tabs (if [bTrimTabs] is set to True)
Dim s As String: s = sfuncTrimEnds(sStr, bTrimTabs)
If bReturnLen Then ' if [bReturnLen] = True then return the trimmed string len
eLen = Len(s)
Else ' if [bReturnLen] = False then return the trimmed string
eLen = s
End If
End Property
'===============================================================
' this function trims spaces from both sides of string and tabs if [bTrimTabs] = true
' the return value is the string with the spaces (and tabs) trimmed off both sides
'===============================================================
Private Function sfuncTrimEnds(ByVal sStr As String, Optional bTrimTabs As Boolean = True) As String
Dim lStart As Long, lEnd As Long
Dim sChr As String
Dim llen As Long: llen = Len(sStr)
Dim l As Long: For l = 1 To llen
sChr = Mid$(sStr, l, 1)
If sChr <> " " And sChr <> vbTab Then
lStart = l
Exit For
End If
Next l
For l = llen To 1 Step -1
sChr = Mid$(sStr, l, 1)
If sChr <> " " And sChr <> vbTab Then
lEnd = l
Exit For
End If
Next l
sStr = Mid$(sStr, lStart, (lEnd - (lStart - 1)))
sfuncTrimEnds = sStr
End Function
これを使用するには:
Dim s As String: s = " " & vbTab & " " & "mary wants my little lamb " & " " & vbTab & " "
MsgBox Tru.eLen(s, , False) 'will return the trimmed text
MsgBox Tru.eLen(s) ' will return the len of the trimmed text
OR
Dim sVal As String: sVal = Tru.eLen(s, , False)
if len(sval) > 0 then ' yada yada
Vb.net(非常によく似ている)で、すべての空白文字と制御文字を前から削除するには:
Public Function TrimWspFromFront(ByRef MyStr As String) As String
While MyStr.Length > 0 AndAlso Left(MyStr, 1) < " "
MyStr = Trim(Right(MyStr, MyStr.Length - 1))
End While
Return MyStr
End Function
背面から取り外すには:
Public Function TrimWspFromEnd(ByRef MyStr As String) As String
While MyStr.Length > 0 AndAlso Right(MyStr, 1) < " "
MyStr = Trim(Left(MyStr, MyStr.Length - 1))
End While
Return MyStr
End Function
NB。コピーを作成するオーバーヘッドを回避するためにByRefとして渡され、他のユーザーはSubとしてコーディングするかByValを渡すことを好むかもしれません
一連のタブホイットスペースと改行が順序付けられていない可能性があり、それらをすべてクリーンアップする必要があるため、関数を自己反復することを忘れないでください。
「タブ&スペース&タブ&タブ&改行&スペース&タブ&ラインブレア....」