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

问题描述:

我需要检查一个字符串的几件事情:如何测试只有字母或撇号的字符串?

  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"); 
} 
+1

请重新格式化代码以获得更好的可读性 - 很难读取您的函数的签名和主体。 –

您可以使用正则表达式在两行中执行此操作。

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 

您的代码对于您要做的事情而言非常复杂。它很长,它包含很多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