【问题标题】:Regex split while reading from file从文件读取时正则表达式拆分
【发布时间】:2015-08-04 03:32:06
【问题描述】:

我有一个文本文件,我正在逐行读取它。

我想用 ',' 分割一行。

但我希望跳过引号“”中的逗号。

我尝试了以下正则表达式,但它无法正常工作。

怎么做。

文件内容是

"Mobile","Custom1","Custom2","Custom3","First Name"
"61402818083","service","in Portsmith","is","First Name"
"61402818083","service","in Parramatta Park","is","First Name"
"61402818083","services","in postcodes 3000, 4000","are","First Name"
"61402818083","services","in postcodes 3000, 4000, 5000","are","First Name"
"61402818083","services",,"are","First Name"

正则表达式如下

,(?=([^\"]*\"[^\"]*\")*[^\"]*$)

此正则表达式为第 5 行输出以下内容

"61402818083"
,"First Name"
"services"
,"First Name"
"in postcodes 3000, 4000, 5000"
,"First Name"
"are"
"First Name"
"First Name"

结果应该如下

"61402818083"
"services"
"in postcodes 3000, 4000, 5000"
"are"
"First Name"

【问题讨论】:

  • “它无法正常工作”对于寻求帮助与去看医生并说“我有疼痛感”一样有用。
  • @maraca 添加了想要的结果

标签: c# asp.net regex string


【解决方案1】:

不要重新发明轮子。似乎您正在尝试解析逗号分隔的文件(即使文件扩展名与 csv 不同)。试试这个。

using (TextFieldParser reader = new TextFieldParser(@"c:\yourpath\file.csv"))
{
    reader.TextFieldType = FieldType.Delimited;
    reader.SetDelimiters(",");
    while (!reader.EndOfData) 
    {
        //Processing a line of the file
        string[] fields = reader.ReadFields();
        // now fields contains 5 elements, e.g.
        // fields[0] = "61402818083"
        // fields[1] = "services"
        // fields[2] = "in postcodes 3000, 4000, 5000"
        // fields[3] = "are"
        // fields[4] = "First Name"
    }
}

注意

需要在项目中添加Microsoft.VisualBasic作为参考

【讨论】:

  • 它不是 csv 文件,而是 txt 文件,我一次只读取一行
  • 你可以试试,你的文件格式和csv是一样的。
【解决方案2】:
using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string line = "\"61402818083\",\"services\",\"in postcodes 3000, 4000\",\"are\",\"First Name\"";
        var reg = new Regex("\".*?\"");
        var matches = reg.Matches(line);
        foreach (var item in matches)
        {
            Console.WriteLine(item.ToString());
        }
    }
}

输出:

"61402818083"
"services"
"in postcodes 3000, 4000"
"are"
"First Name"

https://dotnetfiddle.net/5GxxIo

另一种可能的解决方案:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string line = "\"61402818083\",\"services\",\"in postcodes 3000, 4000\",\"are\",\"First Name\"";
        Console.WriteLine(line.ToString());
        var reg = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
        var matches = reg.Matches(line);
        foreach (Match match in reg.Matches(line))
        {
            Console.WriteLine(match.Value.TrimStart(','));
        }
    }
}

https://dotnetfiddle.net/rRml2D

【讨论】:

  • 这样你也可以使用"\".*?[^\\\\]\""处理转义的"我不知道这方面的政策是怎样的。
  • 使用了您的第一个修复程序。第二个修复也匹配整个字符串。谢谢
【解决方案3】:

我认为你可以通过一个一个地连接字符串来做到这一点。

示例(未测试)

using System.IO;
using System.Text;

int counter = 0;
string line = String.Empty;

StringBuilder newString = new StringBuilder();

StreamReader file = new StreamReader("c:\\test.txt");

while((line = file.ReadLine()) != null)
{
    newString.Append(line + ",");
}

file.Close();

newString.ToString().TrimEnd(',');

【讨论】:

    【解决方案4】:
    ,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
    
         ^^
    

    你的正则表达式是正确的。它有一个不必要的 capturing group 原来是邪恶的。参见演示。

    https://regex101.com/r/fM9lY3/10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多