使用Visual Basic,我有一个字符串。想要检查该字符串是否包含单个大写字母字符后跟一个句号。尝试使用Contains方法,如下所示:
someString.Contains("[A-Z].") ,但这并没有返回我想要的结果。
还需要检查是否为单个数字后跟一个句号。
如何在Visual Basic中实现此功能?
最高評分答案中的邏輯有些問題。此函數僅驗證第一個字符,然後返回 true。這裡是可以驗證整個字符串的字母字符的微調程式碼:
'Validates a string of alpha characters
Function CheckForAlphaCharacters(ByVal StringToCheck As String)
For i = 0 To StringToCheck.Length - 1
If Not Char.IsLetter(StringToCheck.Chars(i)) Then
Return False
End If
Next
Return True 'Return true if all elements are characters
End Function
使用这个函数:
Function CheckForAlphaCharacters(ByVal StringToCheck As String)
For i = 0 To StringToCheck.Length - 1
If Char.IsLetter(StringToCheck.Chars(i)) Then
Return True
End If
Next
Return False
End Function
使用方法
Dim Mystring As String = "abc123"
If CheckForAlphaCharacters(Mystring) Then
'do stuff here if it contains letters
Else
'do stuff here if it doesn't contain letters
End If
"[0-9]*"
仅大写字母:"[A-Z]*"
仅字母,允许混合大小写:"[A-Z][a-z]*"
两个数字,一个大写字母,然后是六个小写字母,最后跟随一个“3”或“7”:"[0-9]{2}[A-Z][a-z]{6}[3,7]"
例如,以下语句测试字符串是否以两个字母开头并以7个数字结尾:(它来自SSRS)System.Text.RegularExpressions.Regex.ismatch(Fields!YourStringToTest.Value,"[A-Z][a-z]{2}[0-9]{7}")
我相信我有另一种方法可以检查字符串中是否有字母,如果这就是你想要检查的全部内容。比如说你有一个随机字符的字符串。例如 "12312H231",这个字符串不同于它,因为它含有字母 "12312h231"。如果你使用 string.tolower = string.toupper,当其包含字母时会返回 false,并且仅在其包含数字时返回 true。
if string1.toupper = string1.tolower then
'string1 is a number
else
'string1 contains a letter
end if
我在查看名称时添加了一个空格检查。如果您的字符串中有空格,这将不返回false。
'Validates a string of alpha characters
Function CheckForAlphaCharacters(ByVal StringToCheck As String)
For i = 0 To StringToCheck.Length - 1
If Not Char.IsLetter(StringToCheck.Chars(i)) Then
If Not Char.IsWhiteSpace(StringToCheck.Chars(i)) Then
Return False
End If
End If
Next
Return True 'Return true if all elements are characters
结束函数
一种解决方案是使用正则表达式。您可以检查以下正则表达式以匹配字母、.和?
([A-Z]|.|\?)
我没有测试过上述内容。
在VBA中,我们需要使用Lcase表示小写字符和Ucase表示大写字符。
If Lcase(String1) = Ucase(String2) then
Msgbox " Numbers"
Else
Msgbox " Alphabets"
End if
最接近的答案是this answer,但它有两个缺陷:首先,出于某种原因,它包括对检查字符串是否包含一个大写字母后跟一个句号。...还需要检查一个数字后面跟着一个句号。
"?"
字符的验证,即使问题没有要求,但更为严重的是,像大多数其他答案一样,它错误地假设输入严格在ASCII范围内,这甚至对于带重音的拉丁字符都不起作用,更不用说其他脚本的字符了。对我来说,很难理解为什么会有这么多错误的答案被发布,却没有一个正确的答案。但是,我打算纠正这个问题。
以下是解决问题的五种不同方法(代码如下)...
前两种方法假设任何Unicode大写字母都可以使用,以及任何Unicode数字,紧随其后的字符必须是一个“.”字符,并且符合这些条件的任意长度字符串都可以。请注意,几种不同脚本中都有“十进制数字”,例如阿拉伯-印度、天城文、孟加拉等。同样,来自世界各地的文字都有大小写的概念,包括非拉丁文字如西里尔文、希腊文等。
一个正确的本地化解决方案应该考虑到所有这些因素,并且无论程序使用的语言(因此也是脚本)如何,都能够正常工作。
在这前两种解决方案中,一种是扫描字符串并显式检查每个字符,另一种是使用正则表达式执行检查。前者可能更容易理解,但在我看来,正则表达式更具表现力,而且并不是那么复杂。
所有这些说法,有时你确实想要限制程序行为仅支持拉丁文字。 因此,我提供了第三到第五个解决方案。第三个与第一个解决方案完全相同,但只允许大写字母和数字的拉丁字符。第四个和第五个是两种不同的基于正则表达式的方法:第四个更容易编写,但需要明确说明拉丁字符的字符值范围;第五个使用Unicode字符块名称,并让 Regex
类找出实际字符值。"IsBasicLatin"
值。此代码示例还包括样本数据和一个简单的辅助方法来测试每个实现。请注意,在样本数据中,第二个和第三个字符串实例似乎具有大写拉丁字母A
字符,实际上具有大写西里尔字母А
字符。因此,在针对拉丁字符要求进行测试时,它将无法通过测试,而在针对支持所有脚本的全球化友好实现进行测试时,它将通过测试。
样本数据还包括一个带有印度数字١
的字符串。同样,这将通过全球化友好测试,但无法通过仅限拉丁字符的版本。
希望这可以帮助您!
Imports System.Text
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Console.OutputEncoding = Encoding.UTF8
Dim values As String() = {"A.", "0.", "aZ.foo", "b9.bar", "É.", "А.", "А!", "e.", "a١.foo", "b0,bar", "é."}
TestValidateWithValues(values, AddressOf ValidateString)
TestValidateWithValues(values, AddressOf ValidateStringRegex)
TestValidateWithValues(values, AddressOf ValidateLatinString)
TestValidateWithValues(values, AddressOf ValidateLatinStringShortRegex)
TestValidateWithValues(values, AddressOf ValidateLatinStringVerboseRegex)
End Sub
Function ValidateString(text As String) As Boolean
If text.Length < 2 Then Return False
For i As Integer = 0 To text.Length - 2
Dim ch As Char = text(i)
If (Char.IsLetter(ch) And Char.IsUpper(ch) Or Char.IsDigit(ch)) And text(i + 1) = "."c Then Return True
Next i
Return False
End Function
Function ValidateStringRegex(text As String) As Boolean
Return Regex.IsMatch(text, "(?:\p{Lu}|\p{Nd})\.")
End Function
Function ValidateLatinString(text As String) As Boolean
If text.Length < 2 Then Return False
For i As Integer = 0 To text.Length - 2
Dim ch As Char = text(i)
If (IsLatinChar(ch) And Char.IsUpper(ch) Or
IsLatinDecimalDigit(ch)) And
text(i + 1) = "."c Then Return True
Next i
Return False
End Function
Function IsLatinChar(ch As Char) As Boolean
Return ch >= ChrW(0) And ch <= "ʯ"c ' IsBasicLatin, IsLatin-1Supplement, IsLatinExtended-A, IsLatinExtended-B, IsIPAExtensions
End Function
Function IsLatinDecimalDigit(ch As Char) As Boolean
Return ch >= "0"c And ch <= "9"c
End Function
Function ValidateLatinStringShortRegex(text As String) As Boolean
Return Regex.IsMatch(text, "(?=[\u0000-ʯ])(?:\p{Lu}|\p{Nd})\.")
End Function
Function ValidateLatinStringVerboseRegex(text As String) As Boolean
Return Regex.IsMatch(text, "(?=[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}\p{IsIPAExtensions}])(?:\p{Lu}|\p{Nd})\.")
End Function
Sub TestValidateWithValues(values As String(), validator As Func(Of String, Boolean))
Console.WriteLine($"Testing method {validator.Method.Name}:")
For Each value In values
Console.WriteLine($"Text: {value}, Result: {validator(value)}")
Next
Console.WriteLine()
End Sub
End Module
附注:如果您不想看到字符替换符号而是要看到实际的 ١
字符,请将控制台窗口字体设置为支持所有测试字符的字体,例如“Courier New”。
Regex.Match(inputString, "regex")