Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 搜索文件时,仅返回重复的字符串_C#_Regex_String_Csv - Fatal编程技术网

C# 搜索文件时,仅返回重复的字符串

C# 搜索文件时,仅返回重复的字符串,c#,regex,string,csv,C#,Regex,String,Csv,目前正在一个停车场的项目中工作。我有一个csv文件,其中包含有关汽车牌照的字符串信息。我已经使用regex退还了90%的车牌,但是更短的个性化车牌没有;t正确返回:即“AA12”返回为“AA12BC”,因为它适合另一个正则表达式 每个字符串都有两个汽车牌照实例,是否有办法只返回证明对正则表达式正确的字符串和两个车牌实例 迄今为止的代码: //开始 using (TextReader reader = File.OpenText(@"C:\Users\user\documents\

目前正在一个停车场的项目中工作。我有一个csv文件,其中包含有关汽车牌照的字符串信息。我已经使用regex退还了90%的车牌,但是更短的个性化车牌没有;t正确返回:即“AA12”返回为“AA12BC”,因为它适合另一个正则表达式

每个字符串都有两个汽车牌照实例,是否有办法只返回证明对正则表达式正确的字符串和两个车牌实例

迄今为止的代码:

//开始

        using (TextReader reader = File.OpenText(@"C:\Users\user\documents\regdata.csv"))
        {
            List<string> lines = new List<string>();
            string pattern = @"[A-Z]{3}[0-9]{3}";
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                lines.Add(line);
            }

            List<string> regExs = new List<string>();

            regExs.Add(@"[A-Z]{3}[0-9]{3}");
            regExs.Add(@"[A-Z]{2}[0-9]{2}[A-Z]{3}");
            regExs.Add(@"[A-Z]{1}[0-9]{3}[A-Z]{3}");
            regExs.Add(@"[A-Z]{1}[0-9]{2}[A-Z]{3}");
            regExs.Add(@"[A-Z]{1}[0-9]{1}[A-Z]{3}");
            regExs.Add(@"[A-Z]{3}[0-9]{2,3}");
            regExs.Add(@"[A-Z]{2}[0-9]{4}");
            regExs.Add(@"[A-Z]{3}[0-9]{2}");
            regExs.Add(@"[A-Z]{2}[0-9]{2}[A-Z]{3}");





                using (StreamWriter writer = new StreamWriter(@"C: \Users\user\Desktop\usersNotes\plates.csv"))
            {

                foreach (var l in lines.Select(x => x.Split(',')[2]))
                {

                    string result = "";
                    foreach (var r in regExs)
                    {

                        Regex myRegex = new Regex(r);

                        Match m = myRegex.Match(l);
                        if (m.Success)
                        {
                            result = m.Value;
                            break;
                        }
                    }


                    writer.WriteLine(l + "," + result);

                }
使用(TextReader=File.OpenText(@“C:\Users\user\documents\regdata.csv”))
{
列表行=新列表();
字符串模式=@“[A-Z]{3}[0-9]{3}”;
弦线;
而((line=reader.ReadLine())!=null)
{
行。添加(行);
}
List regExs=新列表();
regExs.Add(@“[A-Z]{3}[0-9]{3}”);
regExs.Add(@“[A-Z]{2}[0-9]{2}[A-Z]{3}”);
regExs.Add(@“[A-Z]{1}[0-9]{3}[A-Z]{3}”);
regExs.Add(@“[A-Z]{1}[0-9]{2}[A-Z]{3}”);
regExs.Add(@“[A-Z]{1}[0-9]{1}[A-Z]{3}”);
regExs.Add(@“[A-Z]{3}[0-9]{2,3}”);
regExs.Add(@“[A-Z]{2}[0-9]{4}”);
regExs.Add(@“[A-Z]{3}[0-9]{2}”);
regExs.Add(@“[A-Z]{2}[0-9]{2}[A-Z]{3}”);
使用(StreamWriter writer=newstreamwriter(@“C:\Users\user\Desktop\usersNotes\plates.csv”))
{
foreach(行中的变量l.Select(x=>x.Split(',')[2]))
{
字符串结果=”;
foreach(regExs中的var r)
{
正则表达式myRegex=新正则表达式(r);
匹配m=myRegex.Match(l);
如果(m.成功)
{
结果=m.值;
打破
}
}
writer.WriteLine(l+,“+结果);
}

谢谢

这应该能帮到你。我按照我的理解为你编写了(我想)整个解决方案。我制作了一个正则表达式列表而不是字符串列表;这样你就不必在每个循环中构建和分解每个正则表达式对象

假设:(1)板块从来没有“或”,和(2)板块不会出现两次以上

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace DupeOnly {
public partial class Form1 : Form{
   public Form1(){
      InitializeComponent();
   }
   private void button1_Click(object sender, EventArgs e){
      string zRegData = File.ReadAllText(@"C:\Users\user\documents\regdata.csv");
      HashSet<string> hsRegData = new HashSet<string>(); 

  bool tfFirst = true;

  string[] zAllPlateData = zRegData.Split(',');  //License plates don't have comma's

  List<Regex> rxList = new List<Regex>();
  rxList.Add(new Regex(@"[A-Z]{3}[0-9]{3}"));
  rxList.Add(new Regex(@"[A-Z]{2}[0-9]{2}[A-Z]{3}"));
  rxList.Add(new Regex(@"[A-Z]{1}[0-9]{3}[A-Z]{3}"));
  rxList.Add(new Regex(@"[A-Z]{1}[0-9]{2}[A-Z]{3}"));
  rxList.Add(new Regex(@"[A-Z]{1}[0-9]{1}[A-Z]{3}"));
  rxList.Add(new Regex(@"[A-Z]{3}[0-9]{2,3}"));
  rxList.Add(new Regex(@"[A-Z]{2}[0-9]{4}"));
  rxList.Add(new Regex(@"[A-Z]{3}[0-9]{2}"));
  rxList.Add(new Regex(@"[A-Z]{2}[0-9]{2}[A-Z]{3}"));
  Match m;

  using (StreamWriter sw = new StreamWriter(@"C: \Users\user\Desktop\usersNotes\plates.csv")){
     for(int Q = 0; Q < zAllPlateData.Length; Q++){
        if(hsRegData.Add(zAllPlateData[Q]) == false){

           //At this point we know it is a duplicate, must still match a check pattern
           foreach(Regex rx in rxList){
              m = rx.Match(zAllPlateData[Q]);
              if(m.Success){

                 if(tfFirst){
                    tfFirst = false;

                    sw.Write(zAllPlateData[Q]);  //First plate doesn't take a comma
                 }
                 else{
                    sw.Write("," + zAllPlateData[Q]);  //Comma delimit subsequent plates
                 }
                 break;
              }
           }
        }
     }
      }
   }
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用System.IO;
使用系统文本;
使用System.Windows.Forms;
使用System.Text.RegularExpressions;
双重名称空间{
公共部分类Form1:Form{
公共表格1(){
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e){
字符串zRegData=File.ReadAllText(@“C:\Users\user\documents\regdata.csv”);
HashSet hsRegData=新的HashSet();
bool-tfFirst=true;
string[]zAllPlateData=zRegData.Split(',);//车牌没有逗号
List rxList=新列表();
添加(新的正则表达式(@“[A-Z]{3}[0-9]{3}”);
添加(新正则表达式(@“[A-Z]{2}[0-9]{2}[A-Z]{3}”);
添加(新的正则表达式(@“[A-Z]{1}[0-9]{3}[A-Z]{3}”);
添加(新的正则表达式(@“[A-Z]{1}[0-9]{2}[A-Z]{3}”);
添加(新的正则表达式(@“[A-Z]{1}[0-9]{1}[A-Z]{3}”);
添加(新的正则表达式(@“[A-Z]{3}[0-9]{2,3}”);
添加(新的正则表达式(@“[A-Z]{2}[0-9]{4}”);
添加(新的正则表达式(@“[A-Z]{3}[0-9]{2}”);
添加(新正则表达式(@“[A-Z]{2}[0-9]{2}[A-Z]{3}”);
匹配m;
使用(StreamWriter sw=new StreamWriter(@“C:\Users\user\Desktop\usersNotes\plates.csv”)){
for(int Q=0;Q
您不使用CSV解析器有什么原因吗?其目的是返回车牌号,目前准确率为90%,这是因为较短的4-5位数车牌,我很难准确返回,因为它们也适合其他regext。文件是逗号分隔的?因此,如果您只是将文件读入字符串并
。split(','))
它会将其拆分为一组车牌?请在您要查找车牌的文件中添加几行。我认为您的问题更多的是如何收集数据。如果CSV文件中有某种分隔符或中断,您的生活会轻松得多。如果有人的车牌位置为“L1L1”或DOPEFISH?您不能期望创建一个正则表达式来附着所有可能的车牌。