VB.NET如何检查字符串是否包含字母字符和句点?

7

使用Visual Basic,我有一个字符串。想要检查该字符串是否包含单个大写字母字符后跟一个句号。尝试使用Contains方法,如下所示:

someString.Contains("[A-Z].") ,但这并没有返回我想要的结果。

还需要检查是否为单个数字后跟一个句号。

如何在Visual Basic中实现此功能?

12个回答

17
這個最高評分答案中的邏輯有些問題。此函數僅驗證第一個字符,然後返回true。這裡是可以驗證整個字符串的字母字符的微調程式碼:

最高評分答案中的邏輯有些問題。此函數僅驗證第一個字符,然後返回 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

14

使用这个函数:

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

7
显然我不能在这里点赞或评论。然而,正则表达式的答案是解决此问题最简单和最好的方法。例如,如果您需要测试字符串是否为数字或字母或字母数字混合等,则此解决方案可以完成任务。
测试字符串是否为数字使用"[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}")

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

4

我在查看名称时添加了一个空格检查。如果您的字符串中有空格,这将不返回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

结束函数


3
我有一个简单的解决方案,但这个解决方案不够优雅。您可以先创建一个字符串,例如从"A."到"Z."。
假设MyString变量包含您想要测试的字符串。您可以使用String.IndexOf方法来测试MyString中是否存在"A."字符串。如果返回值为非负数,则表示"MyString"中存在"A."。继续进行"B."、"C."等操作,直到"Z."。您可以按照同样的方式重复整数,即"0."、"1."直到"9."。

2

一种解决方案是使用正则表达式。您可以检查以下正则表达式以匹配字母、.和?

([A-Z]|.|\?)

我没有测试过上述内容。


1

在VBA中,我们需要使用Lcase表示小写字符和Ucase表示大写字符。

If Lcase(String1) = Ucase(String2) then
Msgbox " Numbers"

Else
Msgbox " Alphabets"

End if

1
我发现这个问题令人沮丧,尽管它似乎写得相当清楚,但没有经过充分的研究,就有了十个未删除的答案,但是其中没有一个确切地回答了这个问题,甚至包括被接受的答案。
问题在这里:

检查字符串是否包含一个大写字母后跟一个句号。...还需要检查一个数字后面跟着一个句号。

最接近的答案是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”。


@Poyda:“那不是ASCII码吗?”——不,字母'A'不是ASCII码。在C#中,它是UTF16,在任何情况下,字符点本身可以被编码为任何字符编码。说字符本身是任何特定编码都是错误的。无论如何,这个问题并没有规定从'A'到'Z'...那只是他们在尝试解决问题时使用的字符。那不是“规范”...规范可以在代码示例之前的问题文本中找到。至于这个答案是否“优秀”,嗯... - Peter Duniho
我显然认为这是一个写得很好的答案,也是唯一确切回答了问题的答案。但很明显,包括你在内的其他人并没有发现它有用,更别提“优秀”了,尽管你有评论过。 - Peter Duniho

1
你可以创建一个正则表达式来测试这个(或者在谷歌上搜索一个能满足你需求的正则表达式)。然后调用 regex.match。
Regex.Match(inputString, "regex") 

我如何在Visual Basic中创建正则表达式? - user840930
只需将正则表达式字符串放在双引号中即可。正则表达式是 System.Text.RegularExpression 命名空间的一部分。它接受两个值:输入字符串和一个正则表达式字符串。 - Brian
我尝试了以下代码: Dim rowHeaderRegex As Regex = New Regex("([A-Z]|.|?)") Dim M As Match = rowHeaderRegex.Match(rowName)它可以匹配"A. SomeString",但是也会匹配"1. SomeString",是否需要修改正则表达式以排除数字? - user840930

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接