我目前正在自学C#,对它有一个相当不错的把握,但我迷失了如何验证用户只输入一个单词的答案,而且它是大写的,否则我想给他们另一个有机会尝试。
这是我到目前为止所做的:
static void Main(string[] args)
{
//assigned variable
string userInput;
//intializing empty string
string answerInput = string.Empty;
//Creating loop
while ((answerInput == string.Empty) || (answerInput == "-1"))
{
//This is asking the question to the user
Console.WriteLine("Enter your favorite animal: ");
//this is storing users input
userInput = Console.ReadLine();
//using function to validate response
answerInput = letterFunc(userInput);
}
}
//Creating function to only allow letters and making sure it's not left blank.
private static string letterFunc (string validate)
{
//intializing empty string
string returnString = string.Empty;
//validating it is not left empty
if(validate.Length > 0)
{
//iterating through the passed string
foreach(char c in validate)
{
//using the asciitable to validate they only use A-Z, a-z, and space
if ((((Convert.ToInt32(c)) > 64) && ((Convert.ToInt32(c)) < 91)) || (((Convert.ToInt32(c)) > 96) && ((Convert.ToInt32(c)) < 123)) || (Convert.ToInt32(c) == 32))
{
//appensing sanitized character to return string
returnString += c;
}
else
{
//If they try to enter a number this will warn them
Console.WriteLine("Invalid input. Use letters only.");
}
}
}
else
{
//If user enters a blank input, this will warn them
Console.WriteLine("You cannot enter a blank response.");
}
//returning string
return returnString;
}
我想知道是否可以在我创建的函数中执行此操作以验证它们仅使用字母并且通过详细说明它不是空的。感谢。
答案 0 :(得分:1)
正则表达式并不难。问题是,有时你想要实现更复杂的东西,但事实并非如此:
private static string letterFunc (string validate)
{
return new Regex("^[A-Z][a-z]*$").IsMatch(validate) ?
validate :
string.Empty;
}
解释表达式:
^
- 主播:仅在文字开始时与表达式匹配
[A-Z]
- 正好一个字符,从 A 到 Z
[a-z]*
- 零个或多个字符,从 a 到 z
$
- 主播:仅在文字结束时与表达式匹配
通过使用这两个锚,我们希望全文与表达式匹配,而不是它的一部分。
如果您想在第一个字母后添加大写字母(例如CaT
或DoG
),则可以将其更改为:
^[A-Z][a-zA-Z]*$
使用正则表达式:https://regex101.com/r/zwLO6I/2
答案 1 :(得分:1)
正则表达式是执行此操作的标准方法,但查看代码时我并不认为您已为此做好准备。顺便说一句,这不是一种侮辱 - 在某些时候每个人都是初学者!
每当您遇到这样的问题时,首先要确保您的所有要求都是明确定义和具体的:
单字答案:在您的代码中,您已将其定义为&#34;仅包含字母和空格的答案&#34;。这可能不太理想,因为它会阻止人们输入dik-dik之类的答案作为他们最喜欢的动物。但是现在让我们坚持下去。
大写答案:让我们将其定义为&#34;答案,其中第一个字符是大写字母&#34;。
因此,将这两个要求放在一起,我们会尝试验证答案以大写字母开头,并且只包含字母和空格。
编码时,请查看您使用的语言和框架,看看是否有方便的方法可以帮助您。 .NET有很多这些。我们知道我们必须检查String
的个别字符,并且字符串由Char
组成,因此请使用google&#34; c#char type&# 34 ;.查看MSDN page for System.Char,我们可以看到一些方法可以帮助我们:
Char.IsWhiteSpace
- 测试角色是否为空白&#39; (空格,制表符,换行符)Char.IsLetter
- 测试角色是否为字母。Char.IsUpper
- 测试字符是否为大写字母。因此,让我们再次看一下我们的要求并一次实施一个:&#34;以大写字母开头,只包含字母和空格&#34;。
让我们调用用户输入的字符串answer
。我们可以检查第一个字母是这样的大写(注意我们也确保它是第一个字母):
bool isCapitalized = answer.Length > 0 && Char.IsUpper( answer[0] );
我们可以检查它是否只包含这样的字母和空格:
bool containsOnlyLettersAndSpaces = true;
foreach( char c in answer )
{
if( !Char.IsLetter( c ) && !Char.IsWhiteSpace( c ) )
{
containsOnlyLettersAndSpaces = false;
break;
}
}
containsOnlyLettersAndSpaces
开头为真。然后我们查看字符串中的每个字符。如果我们发现一个字母不是字母且不是空格,我们将containsOnlyLettersAndSpaces
设置为false。此外,如果我们发现无效字符,请停止检查。我们现在知道答案无效,没有理由检查其余部分!
现在我们可以将这两个验证的组合作为答案返回:
return isCapitalized && containsOnlyLettersAndSpaces;
这是整个方法:
private bool IsValidAnimal( string answer )
{
bool isCapitalized = answer.Length > 0 && Char.IsUpper( answer[0] );
bool containsOnlyLettersAndSpaces = true;
foreach( char c in answer )
{
if( !Char.IsLetter( c ) && !Char.IsWhiteSpace( c ) )
{
containsOnlyLettersAndSpaces = false;
break;
}
}
return isCapitalized && containsOnlyLettersAndSpaces;
}
学习C#祝你好运,我希望这能帮助你思考如何编写代码!
答案 2 :(得分:0)
我明白了。感谢大家的帮助。
INSTALLED VERSIONS
------------------
commit: None
python: 2.7.12.final.0
python-bits: 64
OS: Linux
OS-release: 4.4.0-57-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: pt_BR.UTF-8
LOCALE: pt_BR.UTF-8
pandas: 0.19.2+0.g825876c.dirty
nose: 1.3.7
pip: 8.1.2
setuptools: 23.0.0
Cython: 0.24
numpy: 1.11.1
scipy: 0.17.1
statsmodels: 0.6.1
xarray: None
IPython: 4.2.0
sphinx: 1.4.1
patsy: 0.4.1
dateutil: 2.5.3
pytz: 2016.4
blosc: None
bottleneck: 1.1.0
tables: 3.2.2
numexpr: 2.6.0
matplotlib: 1.5.1
openpyxl: 2.3.2
xlrd: 1.0.0
xlwt: 1.1.2
xlsxwriter: 0.9.2
lxml: 3.6.0
bs4: 4.4.1
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.13
pymysql: None
psycopg2: None
jinja2: 2.8
boto: 2.40.0
pandas_datareader: None