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