【问题标题】:string letters validation字符串字母验证
【发布时间】:2012-01-20 17:27:52
【问题描述】:

我对字符串和 int 感到困惑。并且无法验证没有数字和奇怪字符的名称。 a-z 和 A-Z 都很好。我了解 do while 循环和哨兵的使用。我在这里看到了 Regex,但由于某种我不知道的原因,它在我的代码中不起作用。我宁愿选择一个我能理解的简单解决方案。我在我的代码中验证了 int 工作得很好,但是验证名称会得到 bool 和 int 错误。

    static void Main(string[] args)
    {
        int age;
        double mileage;
        string strInput, name;
        bool isValid;

        DisplayApplicationInformation();

        DisplayDivider("Start Program");
        Console.WriteLine();

        DisplayDivider("Get Name");
        strInput = GetInput("your name");
        name = strInput;
        Console.WriteLine("Your name is: " + name);
        Console.WriteLine();

        do
        {
        DisplayDivider("Get Age");
        strInput = GetInput("your age");
        isValid = int.TryParse(strInput, out age);
        if (!isValid || (age <= 0))
        {
            isValid = false;
            Console.WriteLine("'" + strInput + "' is not a valid age entry. Please retry...");
        }
        }while (!isValid);
        Console.WriteLine("Your age is: " + age);
        //age = int.Parse(strInput);
        //Console.WriteLine("Your age is: " + age);
        Console.WriteLine();

        do
        {
        DisplayDivider("Get Mileage");
        strInput = GetInput("gas mileage");
        isValid = double.TryParse(strInput, out mileage);
        if (!isValid || (mileage <= 0))
        {
            isValid = false;
            Console.WriteLine("'" + strInput + "' is not a valid mileage entry. Please retry...");
        }
        } while (!isValid);
        Console.WriteLine("Your age is: " + mileage);
        //mileage = double.Parse(strInput);
        //Console.WriteLine("Your car MPT is: " + mileage);

        TerminateApplication();
    }

【问题讨论】:

  • 向我们展示您为验证名称所做的尝试。
  • 你能进一步解释你提到的错误吗?您是否在代码中遇到实际异常?如果是这样,它们是什么,它们发生在哪里,以及它们发生时数据的状态是什么?如果没有实际错误,错误的指示是什么?预期行为与观察到的行为是什么?两者在代码中的哪些地方有偏差?
  • 如果您可以向 Regex 介绍自己,它比您尝试的要简单得多;)
  • "Your age is: " + mileage - 使用适当的名称是值得的。
  • 您是否要验证名称是否包含 Alpha 字符,然后 Validated = true 如果名称具有 AlphaNumeric 或其他字符,例如 $@#%@!()* 则为 False .. 看看Char.All 方法,如果您需要一个简单的示例,我可以为您发布一个.. 对我来说一直很好.. 也发布和有问题的失败名称示例...

标签: c# .net


【解决方案1】:

尽管我建议您使用简单的正则表达式,但您指出您需要不同的解决方案。

看看this question,第一个答案是正则表达式解决方案,但second answer 可能会回答您的问题:

bool result = input.All(Char.IsLetter);

正如 Chris Lively 所指出的,如果您在名称中允许有空格,那么您可以通过以下方式进行验证:

bool result = input.Replace(" ", "").All(Char.IsLetter);

【讨论】:

  • 这将返回 false 例如 var input = "Marry Had A Little Lamb";空格不是字母
  • +1 为答案@DJKRAZE - 规范中不允许空格
  • @DJKRAZE:在这种情况下使用: bool result = input.Replace(" ", "").All(Char.IsLetter);仍然比正则表达式更容易
  • 好点@DJKRAZE,没想到这一点。为 Chris Lively 的解决方案 +1。
  • Regex 说起来并不难......它或多或少归结为理解模式并以正确的顺序得到该死的东西......其他六个中的六个......跨度>
【解决方案2】:

这是一个适合你想要的正则表达式

        Regex reg = new Regex("^[A-Za-z]+$");
        do
        {
            DisplayDivider("Get Name");
            strInput = GetInput("your Name");
            isValid = reg.IsMatch(strInput);
            if (!isValid)
            {
                isValid = false;
                Console.WriteLine("'" + strInput + "' is not a valid name entry. Please retry...");
            }
        } while (!isValid); 

基本上,它说,“匹配字符串的开头(^ 表示开始)和直到字符串结尾的字母($ 表示字符串的结尾)并且必须有 1 个或多个字母(即 +)”

可能是最简单的

现在,这当然是假设您不想要“Firstname Lastname”,因为这意味着涉及空格。如果您需要空格来分隔名称,请告诉我。

【讨论】:

  • 找不到类型或命名空间名称“Regex”(您是否缺少 using 指令或程序集引用?)
  • @badboy 右键单击​​“Regex”,然后将鼠标悬停在“Resolve”上,它应该使用 System.Text.RegularExpressions 显示。添加该参考,您应该会很好。
  • 我不知道,太棒了!我有一个学校实验室,我已经完成了。我只是重新审视自己学习验证。你们太棒了。我希望我能像你们一样理解 c# 并回馈初学者。谢谢。
  • 我使用了 joe_coolish 正则表达式解决方案,不得不通过在使用区域添加一些东西来解决错误消息。我的验证有效,只是为了知道如何去做。我很感激,并希望有一天当我了解更多信息时能够回馈社会。谢谢!
  • 没有问题 :) 很高兴我能帮上忙! +1 也总是很棒! :P
【解决方案3】:

Bad boy @Chris Lively 的建议是你想要一些易于阅读而不是 RegEx 的行

   bool result = strInput.Replace(" ", "").All(Char.IsLetter); 

  if you are wanting to do it the long way with a forloop then look at this example

for (int i = 0; i < strinput.Length; i++)
{
   //if this character isn't a letter and it isn't a Space then return false
   //because it means this isn't a valid alpha string
   if (!(char.IsLetter(strinput[i])) && (!(char.IsWhiteSpace(strinput[i]))))
   return false;
}

【讨论】:

  • DisplayDivider("获取名称"); strInput = GetInput("你的名字"); bool 结果 = strInput.Replace(" ", "").All(Char.IsLetter);名称 = 输入; Console.WriteLine("你的名字是:" + name); Console.WriteLine();
  • 你有没有把 if 包裹起来,只有在有效时才显示名称你需要在原始帖子中以更易读的方式发布确切的代码你可以这样做
  • 我没有得到代码来配合@Chris Lively 的建议。这很简单,完全符合我的要求。我会玩这个解决方案。我还弄清楚了如何使用正则表达式并且永远不会忘记它。我很感激你提供了我想要的东西以及正则表达式的方式。我的武器库里现在有了更多的工具。谢谢大家!
猜你喜欢
  • 2012-09-07
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2013-04-28
相关资源
最近更新 更多