C#检查输入是否为A<;整数>;
可能的投入: 1) ASDF-123-ZXCV-456 2) YUIO-123-BNNM-987 3) QWER-123-LKJH-111 4) A1234 5) A456 我需要找到与Axxx(整数)模式匹配的输入,在本例中,应该返回4)或5) 我尝试了startWith(“A”),但1)仍然返回,因为它也以A开头,但我不希望这样C#检查输入是否为A<;整数>;,c#,C#,可能的投入: 1) ASDF-123-ZXCV-456 2) YUIO-123-BNNM-987 3) QWER-123-LKJH-111 4) A1234 5) A456 我需要找到与Axxx(整数)模式匹配的输入,在本例中,应该返回4)或5) 我尝试了startWith(“A”),但1)仍然返回,因为它也以A开头,但我不希望这样 提前感谢@aleks andreev的评论,您可以尝试: bool IsLetterAThenNumericPattern(string candidate
提前感谢@aleks andreev的评论,您可以尝试:
bool IsLetterAThenNumericPattern(string candidate)
{
return System.Text.RegularExpressions.Regex.IsMatch(candidate, @"^A\d+$");
}
对于以下情况,这将返回true
:
- A1
- A123
- A1234567890101
- B1
- A
- A12345A
- A123-456
从字符串开头开始^
仅匹配字母AA
匹配一个或多个数字\d+
字符串的结尾$
总之,只有当字符串以字母A开头,然后后跟>=1个数字时,此正则表达式才会返回true,其他情况除外。因为它是一种简单的模式,所以您也可以使用Linq或
uint.TryParse
:
var inputs = new List<string>(){
"ASDF-123-ZXCV-456",
"YUIO-123-BNNM-987",
"QWER-123-LKJH-111",
"A1234",
"A456",
"A-456",
"A 456",
"A",
"A1",
""
};
foreach(var input in inputs){
//Linq
bool isMatch = input.Length>0 && input[0]=='A' && input.Skip(1).All(x=>char.IsDigit(x));
//tryparse
bool isMatch2 = input.Length>0 && input[0]=='A' && uint.TryParse(input.Substring(1),NumberStyles.None,CultureInfo.InvariantCulture,out _);
}
var输入=新列表(){
“ASDF-123-ZXCV-456”,
“YUIO-123-BNNM-987”,
“QWER-123-LKJH-111”,
“A1234”,
“A456”,
“A-456”,
“A 456”,
“A”,
“A1”,
""
};
foreach(输入中的var输入){
//林克
bool isMatch=input.Length>0&&input[0]='A'&&input.Skip(1).All(x=>char.IsDigit(x));
//锥虫
bool isMatch2=input.Length>0&&input[0]='A'&&uint.TryParse(input.Substring(1),NumberStyles.None,CultureInfo.InvariantCulture,out);
}
如果您希望字母“A”后面至少有一位数字,您可以在两种方法中为input.Length>1
替换input.Length>0
在我的测试中,Linq更快,其次是uint.TryParse,然后是Regex。其他答案提供了更简洁的方法,但最好了解您自己将如何实现这一点。以下是您尝试使用
.StartsWith(“A”)
static void Main(string[] args)
{
string[] inputs = new string[] {
null,
string.Empty,
"A",
"ASDF-123-ZXCV-456",
"YUIO-123-BNNM-987",
"QWER-123-LKJH-111",
"A1234",
"A456",
"A789Z",
"A000",
"B000"
};
const int longestInputLength = 17;
foreach (string input in inputs)
{
bool result = IsNonNegativeIntegerWithPrefix(input);
Console.WriteLine($"{input,longestInputLength}: {result}");
}
}
static bool IsNonNegativeIntegerWithPrefix(string text)
{
const string prefix = "A";
if (text == null)
{
// Alternative: throw new ArgumentNullException(nameof(text));
return false;
}
// There must be at least one additional character beyond the prefix
if (text.Length < prefix.Length + 1)
return false;
// The string must start with the prefix
if (!text.StartsWith(prefix))
return false;
// Every character after the prefix must be a digit
for (int index = prefix.Length; index < text.Length; index++)
if (!char.IsDigit(text[index]))
return false;
return true;
}
请注意,上面的代码使用任意长度的前缀,而不仅仅是单个字符。我本来会将
prefix
作为一个方法参数,但我不想在该参数为null
或为空时进行处理,以分散对基本逻辑的注意力。那么A1B
呢?应该匹配吗?使用正则表达式。类似于^A\d+$
No A1B的内容不应返回。A后面的字符应仅为整数。您能否澄清模式的整数部分是否是必需的?仅仅“A”
是有效输入吗?允许负整数吗?太棒了!谢谢你,你忘了添加一个链接:)另外,如果你给regex添加一些解释,那就太棒了。例如:^
表示字符串的开头,依此类推。感谢@AleksAndreev-根据您的反馈进行编辑。Mjames已经写出了答案。因此,再写一遍没有意义:对于输入“A”
,您的LINQ方法错误地计算为true
,因为.Skip(1)。对于空序列,All(…)
返回true
。您的TryParse
方法对输入“A-1”
的计算结果错误地为true
,因为它接受负整数。@关于Linq aproach OP的培根没有说后面没有数字,但如果这是一个问题,我可以调整。关于tryparse,我同意,将更正。问题的标题和主体表示他们希望匹配'A'
,后跟一个整数,因此在我看来,整数部分是必需的,尽管他们的测试用例都没有涵盖这一部分。
: False
: False
A: False
ASDF-123-ZXCV-456: False
YUIO-123-BNNM-987: False
QWER-123-LKJH-111: False
A1234: True
A456: True
A789Z: False
A000: True
B000: False