Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中,正则表达式的行为异常_C#_Asp.net_Regex - Fatal编程技术网

C# 在.net中,正则表达式的行为异常

C# 在.net中,正则表达式的行为异常,c#,asp.net,regex,C#,Asp.net,Regex,我有一些代码可以读取CSV文件的每一行,如果值与正确的值不匹配,它会将其添加到返回到用户屏幕的错误列表中。我遇到的问题是正则表达式本身 protected void ReadData(string filePath, bool upload) { StringBuilder sb = new StringBuilder(); #region upload if (upload == true) // CSV file upload chosen {

我有一些代码可以读取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
受保护的void ReadData(字符串文件路径,bool上传)
{
StringBuilder sb=新的StringBuilder();
#区域上载
如果(upload==true)//选择了CSV文件上载
{
使用(CsvReader csv=new CsvReader(new StreamReader(filePath),true))//将csv文件缓存到内存中
{
int fieldCount=csv.fieldCount;//每行的字段总数
string[]headers=csv.GetFieldHeaders();//正确的csv头存储在数组中
SortedList errorList=新建SortedList();//此列表将包含错误值
bool errorFlag=false;
int errorCount=0;
//在读取数据之前,首先检查标题是否正确
if(headers[0]!=“first name”| headers[1]!=“last name”| headers[2]!=“job title”| headers[3]!=“email address”| headers[4]!=“phone number”| headers[5]!=“company”| headers[6]!=“research manager”| headers[7]!=“user card number”)
{
sb.追加(“标题不正确”);
}
其他的
{
而(csv.ReadNextRecord())
尝试
{
//检查csv obj数据的有效值
对于(int i=0;i”);
foreach(错误列表中的KeyValuePair密钥)
{
sb.追加(“
  • ”+键值+“
  • ”); } } else//所有验证检查都等于false。创建用户 { ORCLdap.CreateUserAccount(rootLDAPPath、svcUsername、svcPassword、csv[0]、csv[1]、csv[2]、csv[3]、csv[4]、csv[5]、csv[7]); sb.追加(“新用户数据上传成功”); } }//尝试结束 捕获(例外情况除外) { 某人附加(例如ToString()); } 最后 { lblMessage.Text=sb.ToString(); sb.删除(0,sb.长度); } } } #端区
    lblMessage.text包含以下html:

    错误数目:4

    • 大卫1212
    • 史密斯
    • 镍币444
    • 高迪333
    当它应该是3个错误时,因为smith不包含数字


    有人对此有什么建议吗?

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

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


    您还有一个逻辑错误:

    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]
    就可以了)

    你能把它分解成你想与正则表达式匹配的内容吗?你当前使用的正则表达式,以及你当前得到的结果-我认为这个过程的其余部分确实掩盖了一个简单的问题。当然。名字和姓氏可以包含字母,但不能包含数字。I==0是fieldrow firstname,I==1是fieldrow lastname。我认为我的正则表达式字符串对于只匹配字母的值是正确的。基本上,如果字符串中有数字,则添加到错误列表集合中。谢谢,这非常有效!我将正则表达式字符串更改为您的建议,并将条件设置为==false。例如,如果正则表达式与正确的值不匹配,则添加到错误列表中。Istackoverflow会让我这么做的。你的能力对这个网站来说太快了:DI做了这个改变,但是@DhruvPathak首先给出了答案。谢谢。这就是我为什么写“也”;D没有看到您已经注意到逻辑错误。是的,我知道,添加的A-Z是不必要的,因为还有其他属性,这就是为什么我感谢您指出这一点。