C# 如何使正则表达式只允许2个字符M或F
如果一个字符串由C# 如何使正则表达式只允许2个字符M或F,c#,asp.net,regex,C#,Asp.net,Regex,如果一个字符串由M或F组成,我想使其有效。如果可能,我还想知道是否有人输入了男性或女性,我想得到的结果是M或F。。但是我的第一个例子是检查字符串是否有M或F。在任何其他字符中,我希望将结果设为false。如果只有4个有效选项,则我建议您不要使用正则表达式。您可以使用扩展方法: public static bool InList<T>(this T item, params T[] list) { return list.Contains(item); } 如果这是四种选择之
M
或F
组成,我想使其有效。如果可能,我还想知道是否有人输入了男性
或女性
,我想得到的结果是M
或F
。。但是我的第一个例子是检查字符串是否有M
或F
。在任何其他字符中,我希望将结果设为false。如果只有4个有效选项,则我建议您不要使用正则表达式。您可以使用扩展方法:
public static bool InList<T>(this T item, params T[] list)
{
return list.Contains(item);
}
如果这是四种选择之一,那么结果将是真的。验证性别后,可以使用.SubString()抓取第一个字母。试试这个-
var match = Regex.Match("M", @"^M(ale)?$|^F(emale)?$");
var result = match.Success;
我认为你看错了 您需要的是一个下拉列表或两个单选按钮来约束用户的选择并准确返回所需的数据 否则,您的用户将无法使用您的软件。有些人会打字,有些人可能会在单词后键入空格,有些人会在M或F后使用“.”,因为这是一个缩写。此外,您需要解释您希望他们编写M或F。用户不阅读,因此任何需要解释的内容都是令人烦恼的 只有少数可能答案中的一个答案的问题应使用单选按钮或下拉列表提问 如果你真的想让用户写M或F,请注意,如果用户写“男”或“女”,之前发布的答案都不允许你得到“M”或“F”。如果你走那条路,你需要这样的东西:
your_string.toUpper();
if (your_string.contains("M", "MALE", "F", "FEMALE"))
{
switch (your_string)
{
case "M":
return "M";
case "Male":
return "M";
case "F":
return "F";
case "Female":
return "M";
default:
return false;
}
}
if s[0] == 'M':
if s[1] == \0: return True
if s[1] != 'a': return False
if s[2] != 'l': return False
if s[3] != 'e': return False
if s[4] == \0: return True
return False
if s[0] == 'F':
if s[1] == \0: return True
if s[1] != 'e': return False
if s[2] != 'm': return False
if s[3] != 'a': return False
if s[4] != 'l': return False
if s[5] != 'e': return False
if s[6] == \0: return True
return False
return False
这是可行的,但最好使用正确的UI工具来完成这项工作。在忽略大小写模式下使用regexp^(M | Male | F | Female)$
,如果匹配,则获取第一个字符和大写字母。预编译regexp以获得有效的有限状态机。结果将是如下所示的机器代码:
your_string.toUpper();
if (your_string.contains("M", "MALE", "F", "FEMALE"))
{
switch (your_string)
{
case "M":
return "M";
case "Male":
return "M";
case "F":
return "F";
case "Female":
return "M";
default:
return false;
}
}
if s[0] == 'M':
if s[1] == \0: return True
if s[1] != 'a': return False
if s[2] != 'l': return False
if s[3] != 'e': return False
if s[4] == \0: return True
return False
if s[0] == 'F':
if s[1] == \0: return True
if s[1] != 'e': return False
if s[2] != 'm': return False
if s[3] != 'a': return False
if s[4] != 'l': return False
if s[5] != 'e': return False
if s[6] == \0: return True
return False
return False
在CPU周期数方面很难与之相比。我如何在这里包含我的字符串
Match Match=Regex.Match(strGender,“M”、@“^M(ale)?$|$F(emale)?^)
“M”
只是我代码中的一个示例字符串,因此您需要执行Regex.Match(strGender,@“^M(ale)?$|$F(emale)?^”)代码>我正在从我的excel
文件中读取数据,这就是为什么我要选择Regex
Oups!不过,这正是你可能想在问题摘要中提到的细节。为什么不呢。regexp可以编译成比列表操作更快的高效C代码(有限状态机)。他们可能会在已经读取第一个或第二个字符后停止,甚至不会查看完整的字符串。原因有几个:可维护性、可读性和可扩展性。对于如此简单的事情,正则表达式过于复杂。在正则表达式中可能会出现一些附带的情况,而由4个小词组成的列表是直接且易于管理的,特别是如果OP希望以后添加另一个选项(如其他或未指定等)。在regex方法中,进行这种更改所需的工作量太大,无法证明这一点(在这种情况下,速度对于任何一种方法都不是问题)。像“^(M | Male | F | Female)$”这样的regexp完全不难维护或读取。。。我不认为很快会发现很多新的性别。正则表达式传统上用于匹配模式,而不是检查一个单词是否与其他4个单词匹配。然而,对于每个人来说,编程的美妙之处在于,总是有几种方法可以完成事情。我要指出的是,在这种情况下,我们不需要在regex上下定论。好吧,regexp是一个速记概念,用于指定有限自动机来匹配字符串,这就是他试图做的:匹配字符串。有限状态机当然可以处理困难的情况,但也可以处理简单的情况。特别是当编译成本机代码时,它实际上只会生成几个if和return语句,以最高的CPU效率执行。这是一个合理的问题。