复杂字符串比较逻辑

时间:2016-06-15 00:13:09

标签: c# .net

我需要一些复杂的帮助(对我而言,因为我不太经验)字符串比较逻辑。基本上,我想验证字符串以确保它符合格式规则。我使用的是C#,目标是.NET 4.5.2。

我正在尝试使用API​​,它以这种方式为我提供了预期的字符串格式:

  

1:420 + 4:9 ####(位置1必须有“420”,位置4必须有“9”,位置5-8有数字

     

2:Z + 14:&& +20:10,11,12(位置2的AND必须为“Z”,位置14,15的字母为“10”,“11” ,或从位置20开始的“12”

     

图例:

     

“:”= position / valuelist separator

     

“,”=值分隔符

     

“+”=测试分隔符

     

“#”=仅数字通配符

     

“&安培;” = alpha letter-only wildcard

鉴于此,我的第一个想法是对输入字符串进行一系列子串和拆分,然后对每个部分进行比较?或者,我可以执行for循环并逐个迭代每个字符,直到我达到输入字符串长度的末尾。

在这种情况下,我们假设输入字符串类似于“420987435744585”。使用规则第一,我应该得到一个传递,因为前三个是420,第四个是9,下一个5-8是数字。

到目前为止,我创建了一个方法,如果我通过/失败验证,则返回bool。传入输入字符串。然后我开始拆分+或 - 以获取所有和/或不是部分,然后在逗号上拆分以获取规则组。但这就是我陷入困境的地方。它看起来应该很容易,也许它是,但我似乎无法绕过它,我想我将最终得到大量的数组,foreach循环,if语句等...只是为了验证并在输入字符串与我的格式匹配时返回true / false。

有人可以协助并提供一些指导吗?

谢谢!!!!

2 个答案:

答案 0 :(得分:1)

处理这些条件的最佳方法是使用正则表达式(正则表达式)。起初,你可能会发现它有点复杂,但是值得花时间学习它以简单的非冗长方式处理所有类型的字符串模式。

您可以从这些教程开始:

http://www.codeproject.com/Articles/9099/The-Minute-Regex-Tutorial

http://www.tutorialspoint.com/csharp/csharp_regular_expressions.htm

并使用此作为参考:

https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

答案 1 :(得分:0)

我认为最好的方法是自定义函数,它会比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

祝你好运。