【问题标题】:Regex behaving strangely .net正则表达式行为奇怪.net
【发布时间】:2012-09-17 20:17:00
【问题描述】:

我有一些代码可以读取 CSV 文件的每一行,如果该值与正确的值不匹配,它会将其添加到返回到用户屏幕的错误列表中。我遇到的问题是正则表达式本身。

protected void ReadData(string filePath, bool upload)
{
    StringBuilder sb = new StringBuilder();
    #region upload
    if (upload == true) // CSV file upload chosen
    {
        using (CsvReader csv = new CsvReader(new StreamReader(filePath), true)) // Cache CSV file to memory
        {
            int fieldCount = csv.FieldCount; // Total number of fields per row
            string[] headers = csv.GetFieldHeaders(); // Correct CSV headers stored in array 
            SortedList<int, string> errorList = new SortedList<int, string>(); // This list will contain error values
            bool errorFlag = false;
            int errorCount = 0;

            // Check if headers are correct first before reading data
            if (headers[0] != "first name" || headers[1] != "last name" || headers[2] != "job title" || headers[3] != "email address" || headers[4] != "telephone number" || headers[5] != "company" || headers[6] != "research manager" || headers[7] != "user card number")
            {
                sb.Append("Headers are incorrect");
            }

            else 
            {
                while (csv.ReadNextRecord())
                    try
                    {
                        //Check csv obj data for valid values
                        for (int i = 0; i < fieldCount; i++)
                        {
                            if (i == 0 || i == 1) // FirstName and LastName
                            {
                                if (Regex.IsMatch(csv[i].ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20
                                {
                                    errorList.Add(errorCount, csv[i]);
                                    errorCount += 1;
                                    errorFlag = true;
                                    string text = csv[i].ToString();
                                }
                            }

                            else if (i == 5) // Company name
                            {
                                string text = csv[i];
                                text.Replace("&", "and");
                            }
                        } 

                        if (errorFlag == true)
                        {
                            sb.Append("<b>" + "Number of Error: " + errorCount + "</b>");
                            sb.Append("<ul>");
                            foreach (KeyValuePair<int, string> key in errorList)
                            {
                                sb.Append("<li>" + key.Value + "</li>");
                            }
                        }
                        else // All validation checks equaled to false. Create User
                        {

                            ORCLdap.CreateUserAccount(rootLDAPPath, svcUsername, svcPassword, csv[0], csv[1], csv[2], csv[3], csv[4], csv[5], csv[7]);
                            sb.Append("<b>New user data uploaded successfully</b>");
                        }

                    }// end of try

                    catch (Exception ex)
                    {
                        sb.Append(ex.ToString());
                    }

                    finally
                    {
                        lblMessage.Text = sb.ToString();
                        sb.Remove(0, sb.Length);

            }
        }
    }
    #endregion

lblMessage.text 包含这个 html:

错误数:4

  • 大卫1212
  • 史密斯
  • 尼克444
  • 高迪333

什么时候应该是 3 个错误,因为 smith 不包含数字。

有人对此有什么建议吗?

【问题讨论】:

  • 你能把它分解成你想用正则表达式匹配的吗?您当前正在使用的正则表达式,以及您当前得到的结果 - 我认为这里的其余过程确实使原本简单的问题变得模糊不清。
  • 当然。名字和姓氏可以包含字母,但不能包含数字。 I == 0 是字段行名字,i == 1 是字段行姓氏。我认为我的正则表达式字符串对于匹配仅是字母的值是正确的。基本上,如果字符串中有数字,则添加到错误列表集合中。

标签: c# asp.net regex


【解决方案1】:

您需要在您的正则表达式中添加单词边界,或者以 '^' 开头并以 '$' 结尾 IE。 ^[a-zA-Z]+$

http://regexr.com?3298g

您当前的正则表达式不正确,并且将匹配任何包含 a-z 或 A-Z 的字符串,任何字母,在任何位置。

http://regexr.com?3298j

【讨论】:

  • 感谢这完美的作品!我将正则表达式字符串更改为您的建议并将条件设置为 == false。例如如果正则表达式不匹配正确的值添加到错误列表。
  • 当 stackoverflow 允许时我会这样做。对于这个网站,你的能力太快了:D
【解决方案2】:

你还有一个逻辑错误:

if (Regex.IsMatch(csv[i].ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20

应该是

if (!Regex.IsMatch(csv[i].ToString(), "^[a-zA-Z]+$", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20

因为只有名称中包含[a-zA-Z]以外的其他字符才会出错,对吧?

(如果您使用RegexOptions.IgnoreCase,则不需要[a-zA-Z][a-z] 可以)

【讨论】:

  • 我做了这个改变,但@DhruvPathak 首先给出了答案。还是谢谢。
  • 这就是为什么我写了“也”;D 没看到你已经注意到逻辑错误。
  • 是的,我知道,添加的 A-Z 是不必要的,因为还有其他属性,这就是我感谢您指出这一点的原因。
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多