我需要一些复杂的(无论如何,因为我不太经验)字符串比较逻辑的帮助。基本上,我想验证一个字符串,以确保它符合格式规则。我正在使用C#,目标是.NET 4.5.2。
我正在尝试使用一个API,该API以这种方式给出了字符串的预期格式:
1:420+4:9#### (从位置1开始有“420”,位置4有“9”,位置5-8有数字数字)。 2:Z+14:&&+20:10,11,12 (位置2必须有“Z”,位置14、15处必须有字母,从20位置开始必须有“10”、“11”或“12” 图例: ":“=位置/估价师分隔符 ",“=值分隔符 "+“=测试分离器 "#“=数字通配符 "&“= alpha字母通配符
考虑到这一点,我的第一个想法是对输入字符串执行一系列子字符串和拆分操作,然后对每个部分进行比较?或者,我可以执行一个for循环,然后逐个遍历每个字符,直到到达输入字符串长度的末尾。
在这种情况下,让我们假设输入字符串类似于"420987435744585“。使用第一条规则,我应该通过这个,因为前三个是420,位置4是9,下一个5-8是数字。
到目前为止,我已经创建了一个方法,如果我通过/失败验证,将返回bool。输入字符串被传入。然后,我开始在+或-上拆分,以获得所有的和或非部分,然后在逗号上拆分以获得规则组。但这就是我被困的地方。这似乎应该很容易,也许是,但我只是不能把我的头围绕着它,我正在想,我将以大量的数组,前缘循环,如果语句,等等.如果输入字符串与我的格式匹配,只需验证并返回true/false。
有人能帮忙给我指点吗?
谢谢!
发布于 2016-06-15 06:47:39
我认为最好的方法是一个自定义函数,它将比RegEx更快,将该格式转换为RegEx需要大量的手工工作。
我已经从验证函数开始了,它对您提供的示例进行测试。
以下是代码:
static bool CheckFormat(string formatString, string value)
{
string[] tests = formatString.Split('+');
foreach(string test in tests)
{
string[] testElement = test.Split(':');
int startPos = int.Parse(testElement[0]);
string patterns = testElement[1];
string[] patternElements = patterns.Split(',');
foreach(string patternElement in patternElements)
{
//value string not long enough, so fail.
if(startPos + patternElement.Length > value.Length)
return false;
for (int i = 0; i < patternElement.Length; i++)
{
switch(patternElement[i])
{
case '#':
if (!Char.IsNumber(value[i]))
return false;
break;
case '&':
if (!Char.IsLetter(value[i]))
return false;
break;
default:
if(patternElement[i] != value[i])
return false;
break;
}
}
}
}
return true;
}如果你想玩它,dotnet小提琴就在这里:https://dotnetfiddle.net/52olLQ。
祝好运。
发布于 2016-06-15 00:34:00
处理这些条件的最佳方法是使用正则表达式(Regex)。一开始,您可能会发现它有点复杂,但值得花时间学习它,以一种简单的、非冗长的方式处理所有类型的字符串模式。
您可以从以下教程开始:
http://www.codeproject.com/Articles/9099/The-Minute-Regex-Tutorial
expressions.htm
并以此作为参考:
https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx
https://stackoverflow.com/questions/37824153
复制相似问题