有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何只测试字符串中的字母或撇号?

我需要检查字符串中的一些内容:

  1. 第一个字母必须是大写字母
  2. 只有字母或撇号(')
  3. 最多可以使用2个撇号

下面的代码总是返回字符串不一致,除非我只输入1个大写字母。我如何纠正它以满足我的要求

Private Function setName(ByVal pName As String)
    Dim letters As Integer()
    Dim aphCount As Integer = 0
    Dim isvalid As Boolean = True
    For i As Integer = 0 To pName.Length - 1 Step 1
        ReDim letters(i)
        letters(i) = Asc(pName.Substring(i, 1))
    Next

    If Not letters(0) >= 65 And letters(0) <= 90 Then
        isvalid = False
    End If

    For i As Integer = 1 To pName.Length - 1 Step 1
        If letters(i) >= 39 And letters(i) <= 122 Then
            If letters(i) = 39 Then
                aphCount += 1
                If aphCount > 2 Then
                    isvalid = False
                End If
            ElseIf letters(i) >= 65 And letters(i) <= 90 Then

            ElseIf letters(i) >= 97 And letters(i) <= 122 Then

            Else isvalid = False
            End If
        Else isvalid = False
        End If
    Next

    If isvalid = False Then
        If MsgBox("you put in an invalid name", MsgBoxStyle.RetryCancel, "name error") = MsgBoxResult.Cancel Then
            pName = "Hero" & heroCount
        Else
            pName = inputName()
            pName = setName(pName)
        End If
    End If
    Return pName
End Function

编辑:感谢大家的帮助,我开始学习正则表达式,并想出了一些有用的方法(使用java,我改用java,因为这是我学习编码的一个项目,java提供了更多):

public void checkName(String name)  throws IllegalArgumentException{
     String noSpaceName = name.replaceAll("\\s+","");
     String pattern = "^[A-Z][A-Za-z]*'?[A-Za-z]*'?[A-Za-z]*";    
     Pattern re = Pattern.compile(pattern);
     Matcher m = re.matcher(noSpaceName);
     if (m.matches()){
         name.replaceAll("\\s+"," ");
         super.setName(name);
     }else throw new IllegalArgumentException ("Exception: Name is invalid");
}

共 (2) 个答案

  1. # 1 楼答案

    你的代码对于你要做的事情来说非常复杂。它相当长,包含很多magic numbers。可以使用正则表达式或通过对字符串中的每个元素进行正则比较来解决这个问题。这是第二种方式的一个例子:

    Private Function IsValidName(name As String) As Boolean
        If String.IsNullOrWhiteSpace(name) Then Return False
    
        Return Char.IsUpper(name.AsEnumerable().First()) AndAlso
               name.AsEnumerable().All(Function(c) Char.IsLetter(c) OrElse c.Equals("'"c)) AndAlso
               name.AsEnumerable().Count(Function(c) c.Equals("'"c)) <= 2
    End Function
    
  2. # 2 楼答案

    可以用两行正则表达式来实现这一点

    Private Function IsValidName(name As String) As Boolean
        Dim match = Regex.Match(name, "^[A-Z]((')|[A-Za-z])*$")
        Return match.Success AndAlso match.Groups(2).Captures.Count <= 2
    End Function