跳转到内容

Visual Basic/内置字符串函数

来自 Wikibooks,开放世界中的开放书籍

如果两个字符串具有相同的内容,则它们按值相等

  • 如果 "Hello" = "Hello" 则 MsgBox "A"

语句Option Compare Text可以放置在模块的顶部,使比较不区分大小写,影响 =, <, >, <=, >=, <>

Option Compare Text
Sub Test()
  If "Hello" = "hello" Then MsgBox "A"
  If "aaa" < "BBB" Then MsgBox "B"
End Sub

要测试两个字符串是否按引用相等,即它们是否以相同的地址开始,可以使用 StrPtr 函数。

要测试一个字符串是否大于或小于另一个使用词典顺序,可以使用 <, >, <=, >=, <>。要确定一个字符串是否小于另一个,这两个字符串将逐个字符进行比较,一旦发现一个字符串中的一个字符的 ASCII 码小于另一个字符串中对应(相同位置)的字符,则第一个字符串被声明为小于第二个字符串。相反的测试也有效。

另一种测试字符串是否相等或大于另一个的方法是StrComp函数。与 =, <, > 等不同,StrComp 函数有一个可选参数,用于控制比较是否区分大小写。

示例

strHello = "hello": strHello2 = "Hello"
If StrComp(strHello, strHello2, vbTextCompare) = 0 Then
  Debug.Print "The strings are the same."
End If

链接

用于执行字符串连接的操作符是&。操作符+有时可以起到相同的效果,但不总是如此

a = "123"
b = "456"
c = a & b 'Yields 123456
d = a + b 'Yields 123456: applied to two strings
Debug.Print c, d

a = 123   'A number, not a string
b = "456" 'A string
c = a & b 'Yields 123456
d = a + b 'Yields 579: applied to a number and to a string
Debug.Print c, d

要找出某个字符串是否是另一个字符串的子字符串,请使用 InStr 函数,如下所示

  If InStr("Hello","He") > 0 Then
    MsgBox "The second string is contained in the first string."
  End If
  If InStr("He","Hello") > 0 Then
    MsgBox "This never gets printed; wrong argument order."
  End If

如果找到子字符串,InStr 函数将返回子字符串的位置,否则返回 0。

InStr 函数的双参数用法区分大小写。不区分大小写的包含测试可以按如下方式完成

  If InStr(UCase("Hello"), UCase("he")) > 0 Then
    MsgBox "The second string is contained in the first string when we " & _
           "disregard the case."
  End If

要将一个字符串替换为第三个字符串中的另一个字符串,请使用内置函数 Replace,如下所示

  Result = Replace("Teh Beatles", "Teh", "The") 'results into "The Beatles"

索引和子字符串

[编辑 | 编辑源代码]

字符串的使用方式几乎与字符列表相同。字符串中的第 n 个字符可以通过下标返回

Mid$(String1, n, 1)

n 的值从 1 开始而不是从 0 开始。

还可以返回字符串的子字符串。使用相同的函数,但不是指定 1,而是指定子字符串的长度

Offset = 2: Length = 3
Debug.Print Mid$("abcdef", Offset , Length) 'Prints bcd

如果请求的字符数超过可用字符数,则只返回可用的字符,不会引发错误

Debug.Print Mid$("abcdef", 2, 33) 'Prints bcdef

您也可以在赋值语句左侧使用Mid$

String1 = "aaaaaa"
Debug.Print String1 'Prints aaaaaa
Mid$(String1, 2, 3) = "bbb"
Debug.Print String1 'Prints abbbaa
Mid$(String1, 3, 1) = "cccccc"
Debug.Print String1 'Prints abcbaa
Mid$(String1, 2, 3) = "d"
Debug.Print String1 'Prints adcbaa

当 Mid$ 在左侧时,它不会改变字符串的总长度:它只是替换指定的字符数。如果右侧指定的字符数少于请求的字符数,则只替换该字符数;如果指定的字符数更多,则只使用请求的字符数。

链接

字符串常量

[编辑 | 编辑源代码]

字符串常量可以像其他任何常量一样声明

 Const s As String = "abcdef"

字符串函数

[编辑 | 编辑源代码]

字符串不是对象,因此它们没有方法,但是有一些函数可以操作字符串。请注意,除了在赋值语句的左侧使用 Mid$ 之外,没有一个函数会修改原始字符串

Asc
返回字符串第一个字符的整数代码。反函数是Chr
Len
返回字符串的长度。
InStr
返回子字符串在字符串中首次出现的位置,如果未找到子字符串,则返回 0。
InstrB
类似于 InStr,但它返回字节位置。需要记住的是,Visual Basic 6 字符串是 Unicode 字符串。
InstrRev
类似于 InStr,但它返回子字符串最后一次出现的字符位置。
Left$
返回字符串开头指定的字符数。如果字符串中的字符数更少,Left$ 将返回整个字符串,不会引发错误,
Mid$
返回从给定位置开始的指定数量的字符,在左侧它会替换这些字符,
Right$
返回字符串末尾指定的字符数,如果字符数不足,则 Right$ 将返回整个字符串。
IsNumeric
如果字符串看起来像数字,则返回 True。
LTrim$, RTrim$, Trim$
分别返回字符串的副本,其中删除了前导空格、尾随空格或前导和尾随空格。请注意,只删除 ASCII 空格(字符代码 32),其他空白字符(如制表符)被视为非空格。
LCase$, UCase
分别将整个字符串转换为小写或大写。
Val
返回一个数字,对应于字符串开头找到的数字。请注意,Val 不是区域设置感知的,这意味着它始终期望小数点,无论您的计算机的区域设置如何;如果您从逗号分隔的文件中读取数据,这可能是您要使用的函数。
Str
返回与给定数字对应的字符串。与Val类似,它不是区域设置感知的。如果您要创建一个包含数字的文本文件,并在其他人的计算机上读取该文件,则应该使用此函数。
CStr
将表达式转换为字符串。此过程区域设置感知的,是将数字和其他类型的值转换为字符串以便用户显示的正确函数。通常情况下,这是不必要的,因为 Visual Basic 会在必要时自动转换,并使用区域设置来执行此操作。
Format$
使用特定格式将数字转换为字符串。格式以一系列字符的形式提供,这些字符显示了小数点前后应该给出多少位数字。与CStr类似,Format$是区域设置感知的,因此小数点分隔符将是用户区域设置中指定的任何分隔符。Format$还提供将日期转换为各种内置和自定义字符串格式的功能。
CBool, CByte, CCur, CInt, CLng, CSng, CDbl, CDec
区域设置感知的转换到Boolean, Byte, Currency, Integer, Long, Single, Double, Decimal
Split
将字符串分割成多个片段,并返回一个Variant Array。如果未指定分隔符,则将使用空格。分隔符可以是任何长度的任何字符串。两个相邻的分隔符将分隔一个空字符串。
Hex$
返回一个字符串,其中包含表示数字的十六进制字符。
Oct$
返回一个字符串,其中包含表示数字的八进制字符。
Replace$
返回一个字符串,其中将指定子字符串的所有出现位置替换为新字符串。请注意,子字符串和新字符串不必具有相同的大小。
StrComp
如果第一个字符串小于第二个字符串,则返回 -1;如果它们相同,则返回 0;如果第一个字符串大于第二个字符串,则返回 +1。接收一个可选参数,用于确定比较算法:vbBinary 用于使用字符代码进行精确比较,vbTextCompare 用于不区分大小写的比较。

字符串中的引号

[编辑 | 编辑源代码]

由于双引号 (") 用于分隔字符串,因此您不能直接使用它来指定字符串中的引号。例如

 ' Does not work - syntax error
 Debug.Print "Fred says "Hi" to you"

一种方法是使用 Chr() 函数来指定字符代码 (34)

 ' Works fine
 Debug.Print "Fred says " & Chr$(34) & "Hi" & Chr$(34) & " to you"

另一种方法是将双引号加倍。您可能会发现这种方法比上面提到的方法更易读或更难读。

 ' Works fine too
 Debug.Print "Fred says ""Hi"" to you"

StartsWith 和 EndsWith

[编辑 | 编辑源代码]

Visual Basic 没有其他一些编程语言中常见的 "startsWith"(或 "BeginsWith")和 "endsWith" 函数。但它有 "Like" 比较运算符,用于简单的模式匹配,当与 "*" 一起使用时表示“任何字符串”。

If "Hello World" Like "Hello*" Then MsgBox "It starts."
If "Hello World" Like "*World" Then MsgBox "It ends."
If LCase("Hello World") Like "hello*" Then MsgBox "It starts, case insensitive."
If LCase("Hello World") Like "*world" Then MsgBox "It ends, case insensitive."
Ending = "World"
If "Hello World" Like "*" & Ending Then MsgBox "It ends."

此外,您可以使用 "Left" 函数自己编写这些函数。

Function StartsWith(Str1 As String, Str2 As String, Optional CaseIns As Boolean) As Boolean
  StartsWith = False
  If CaseIns Then 'Case insensitive
    If Left(LCase(Str1), Len(Str2)) = LCase(Str2) Then
      StartsWith = True
    End If
  Else
    If Left(Str1, Len(Str2)) = Str2 Then
      StartsWith = True
    End If
  End If
End Function

Function EndsWith(Str1 As String, Str2 As String, Optional CaseIns As Boolean) As Boolean
  EndsWith = False
  If CaseIns Then 'Case insensitive
    If Right(LCase(Str1), Len(Str2)) = LCase(Str2) Then
      EndsWith = True
    End If
  Else
    If Right(Str1, Len(Str2)) = Str2 Then
      EndsWith = True
    End If
  End If
End Function

对于一次性与常量字符串的比较,函数调用可能有点过头。

If Left(String1, 9) = "Beginning" Then
  'Starts with, case-sensitive
  ...
Else
  ...
End If

If Right(String1, 3) = "end" Then
  'Ends with, case-sensitive
  ...
Else
  ...
End If

模式匹配

[编辑 | 编辑源代码]

您可以使用 Like 关键字进行简单的模式匹配;对于复杂的模式匹配,请参阅 正则表达式Like 模式中的特殊字符包括  ? 用于单个字符,* 用于任意数量的字符,# 用于单个十进制数字,[...] 用于列表中的单个字符,以及 [!...] 用于列表中不存在的单个字符。

示例

If "Hello World" Like "Hello*" Then MsgBox "A"
If "Hello World" Like "*World" Then MsgBox "B"
If "Itam" Like "It?m" Then MsgBox "G"
If "AB345" Like "[A-Z][A-Z]###" Then MsgBox "C"
If "Ab345" Like "[a-zA-Z][a-zA-Z]###" Then MsgBox "D"
If "Item" Like "[!;][!;][!;][!;]" Then MsgBox "E"
If Not "It;m" Like "[!;][!;][!;][!;]" Then MsgBox "F"

链接

上一个:字符串 目录 下一个:正则表达式
华夏公益教科书