我从控制台读取一个字符串。如何确保它只包含英文字符和数字?
答案 0 :(得分:28)
假设“英文字符”只是指26个字符的拉丁字母,那么我将使用正则表达式:^[a-zA-Z0-9 ]*$
例如:
if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }
在这种情况下,正则表达式的好处在于,您真正关心的是字符串是否与模式匹配 - 这是正则表达式非常有效的方法。它清楚地捕捉了你的意图,如果你对“英文字符”的定义超出了26个字母的范围,就很容易扩展。
有一个体面的series of articles here可以更多地讲授正则表达式。
JørnSchou-Rode的回答提供了一个很好的解释,说明这里呈现的正则表达式如何与您的输入相匹配。
答案 1 :(得分:16)
您可以将其与此正则表达式匹配:^[a-zA-Z0-9]*$
^
匹配字符串的开头(即在此点之前不允许任何字符)[a-zA-Z0-9]
匹配来自a-z的大写字母,以及数字0-9 *
让上一场比赛重复零次或多次$
匹配字符串的结尾(即此点后不允许使用任何字符)要在C#程序中使用该表达式,您需要导入System.Text.RegularExpressions
并在代码中执行以下操作:
bool match = Regex.IsMatch(input, "^[a-zA-Z0-9]*$");
如果要针对模式测试很多行,可能需要编译表达式:
Regex pattern = new Regex("^[a-zA-Z0-9]*$", RegexOptions.Compiled);
for (int i = 0; i < 1000; i++)
{
string input = Console.ReadLine();
pattern.IsMatch(input);
}
答案 2 :(得分:2)
答案 3 :(得分:1)
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~');
似乎便宜,但它对我有用,合法的答案很简单。
希望它可以帮助任何人。
答案 4 :(得分:1)
另一种方法是检查IsLower和IsUpper是否都不返回true。 类似的东西:
SELECT BDSReleaseBDDSBPD.ProjectID,
BDSFlowDetails.Flowid,
IterationID,
MAX(CASE WHEN ReleaseTask = 'BDDS' THEN UID END) AS 'BDDS UID',
MAX(CASE WHEN ReleaseTask = 'BDDS'
THEN CONCAT(FirstName, '_', Lastname) END) AS BDDSReleasedBy,
MAX(CASE WHEN ReleaseTask = 'BDDS'
THEN ReleaseDate END) AS 'BDDS Released Date' ,
MAX(CASE WHEN ReleaseTask = 'BPD' THEN UID END) AS 'BPD UID' ,
MAX(CASE WHEN ReleaseTask = 'BPD'
THEN CONCAT(FirstName, '_', Lastname) END) AS BPDReleasedBy,
MAX(CASE WHEN ReleaseTask = 'BPD'
THEN ReleaseDate END) AS 'BPD Released Date'
FROM BDSReleaseBDDSBPD
INNER JOIN BDSFlowDetails
ON BDSFlowDetails.FlowID = BDSReleaseBDDSBPD.FlowID
INNER JOIN BDSUserProfile
ON BDSUserProfile.UserName = BDSReleaseBDDSBPD.UserName
WHERE BDSReleaseBDDSBPD.ProjectID = 861
GROUP BY BDSReleaseBDDSBPD.ProjectID,
BDSFlowDetails.Flowid,
IterationID
ORDER BY BDSFlowDetails.Flowid
并使用它:
private bool IsAllCharEnglish(string Input)
{
foreach (var item in Input.ToCharArray())
{
if (!char.IsLower(item) && !char.IsUpper(item) && !char.IsDigit(item) && !char.IsWhiteSpace(item))
{
return false;
}
}
return true;
}
答案 5 :(得分:0)
bool AllAscii(string str)
{
return !str.Any(c => !Char.IsLetterOrDigit(c));
}
答案 6 :(得分:0)
这样的事情(如果你想控制输入):
static string ReadLettersAndDigits() {
StringBuilder sb = new StringBuilder();
ConsoleKeyInfo keyInfo;
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter) {
char c = char.ToLower(keyInfo.KeyChar);
if (('a' <= c && c <= 'z') || char.IsDigit(c)) {
sb.Append(keyInfo.KeyChar);
Console.Write(c);
}
}
return sb.ToString();
}
答案 7 :(得分:0)
如果我不想使用RegEx,只是为了提供替代解决方案,您只需检查每个字符的ASCII码,如果它位于该范围之间,它可以是英文字母或数字(这可能是不是最好的解决方案):
foreach (char ch in str.ToCharArray())
{
int x = (int)char;
if (x >= 63 and x <= 126)
{
//this is english letter, i.e.- A, B, C, a, b, c...
}
else if(x >= 48 and x <= 57)
{
//this is number
}
else
{
//this is something diffrent
}
}
http://en.wikipedia.org/wiki/ASCII表示完整的ASCII表格。
但我仍然认为,RegEx是最好的解决方案。
答案 8 :(得分:0)
我同意正则表达式的答案。但是,您可以将其简化为“^ [\ w] + $”。 \ w是任何“单词字符”(如果您使用非unicode字母表,则会转换为[a-zA-Z_0-9]。我不知道您是否也想要下划线。
更多关于.net中的正则表达式:http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8
答案 9 :(得分:0)
正如许多人所指出的,只有在字符串中只有一个单词时,接受的答案才有效。因为没有答案涵盖字符串中多个单词甚至句子的情况,所以代码如下:
stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126));
答案 10 :(得分:0)
ssh -p $PORT -t $USER@IP bash -c "
while IFS='' read -r line || [[ -n "\$line" ]]; do
echo 'Text read from file: \$line;
done < $SAVED_CONFIGURATION
"
答案 11 :(得分:0)
不要使用RegEx和LINQ,它们比字符串
的循环慢我的解决方案:
private static bool is_only_eng_letters_and_digits(string str)
{
foreach (char ch in str)
{
if (!(ch >= 'A' && ch <= 'Z') && !(ch >= 'a' && ch <= 'z') && !(ch >= '0' && ch <= '9'))
{
return false;
}
}
return true;
}
答案 12 :(得分:0)
可接受的答案正则表达式不支持空格或标点符号。下面的代码已针对此输入进行了测试:
123 abc! ?? -_)(/ \;:
text1 = "123 abc! ?? -_)(/\\ ; :";
bool t = Regex.IsMatch(text1, "^[a-zA-Z0-9. -_?]*$") //true
text2 = "ف";
bool f = Regex.IsMatch(text2, "^[a-zA-Z0-9. -_?]*$") //false