有没有简单的方法来比较字母数字而不使用正则表达式?

时间:2014-09-11 15:47:26

标签: c# .net

我试图比较有时在前面有字符A-Z的字符串,看它是否存在于列表中。

比较225225.之类的内容,看看它是否存在于像这样的值列表中

225.0
235.9
A23.8
B56.0
345.8

我的正则表达式在225.(有句号)时失败。它应该匹配列表中的第一个,因为它们是相同的数值。

if (codesList[i].IndexOf(".") < 0)
{
    code = new System.Text.RegularExpressions.Regex("\\b" + codesList[i].Replace(".", "[.]") + "(?![.])\\b");
}
else
{
    code = new System.Text.RegularExpressions.Regex("\\b" + codesList[i].Replace(".", "[.]") + "\\b");
}

if (code.IsMatch(stringToFind))
{
    found = true;
}

然后我通过转换为十进制使用精确数值。但是,如果值前面有一个字符,则不起作用。

编辑 - &gt;我不知道除了我想要查看字符串是否与列表中的字母数字值匹配之外我还能澄清多少。但它必须在数值方面匹配(暂时忽略字母字符),一旦匹配,字母字符必须完全匹配。

因此A57.0应与A57匹配。和A57 但A57.01与A57不匹配。或者A57也不会是Z57。

与常规数值相同 234.0必须等于234和234。

5 个答案:

答案 0 :(得分:1)

首先,您应该从您尝试比较的字符串中删除所有非数字字符。

然后转换为数字并进行比较。

    bool found = false;

    foreach(var code in codesList)
    {
        Regex rgx = new Regex(@"[^0-9\-\.]");
        code = rgx.Replace(code, "");

        double num;

        if(double.TryParse(code, num))
        {
            // floating point number comparison should be done against a delta,
            // adjust as needed
            if(Math.Abs(num - numberToFind) < 0.000001d)
            {
                found = true;
                break;
            }
        }    
    }

答案 1 :(得分:0)

这应该对你有所帮助,但我仍然不明白为什么你需要&#34;。&#34;在搜索字符串中:

List<string> codelist = new List<string>()
{
     "225.01",
     "225.00",
     "235.9",
     "A23.8",
     "B56.0",
     "345.8",
     "ZR5.0"
};

string stringToFind = "225.";
bool found = false;

foreach (string item in codelist)
{
     string[] parts = item.Split('.');
     //Convert.ToInt32(parts[1]),if its 01 it will be false
     //because the int returned will be 1 so only fractions
     //with only 0 will be true
     if (Convert.ToInt32(parts[1]) == 0)
     {
         //will be true for the item "225.00" or "225.0"
         if ((found = stringToFind.Contains(parts[0])) == true)
            break;
     }
}

我们stringToFind.Contains(parts[0])),因为那是&#34;改变&#34;字符串它可以有一个点或没有点,而部分[0]将始终只有这个例子中的数字225。

答案 2 :(得分:0)

bool Match(string s1, string s2) {
    string alphas = "ABCDEFGHIJKLMNOPQRSVWXYZ";
    foreach (char chr in alphas) {
        s1 = s1.Replace(chr.ToString(), "");
        s2 = s2.Replace(chr.ToString(), "");
    }

    decimal d1 = decimal.Parse(s1);
    decimal d2 = decimal.Parse(s2);
    return d1 == d2;
}

答案 3 :(得分:-1)

你说它应该“匹配列表中的第一项”,但你的代码示例只是将其标记为true。如果您想要专门知道哪个项目匹配,则可以执行此操作:

var theCodeThatMatches = codesList.First(code => code.Contains("255"));

if(theCodeThatMatches == null) return;

//do stuff to theCodeThatMatches

答案 4 :(得分:-1)

如果这些项目在列表中:

 string codeValue = "255";

 var results = listItems.Where(w => w.Value.IndexOf(codeValue, StringComparison.OrdinalIgnoreCase) >= 0);