3

我正在寻找有关 RegEx 模式的一些指导。

我有一个管道分隔文件,我想删除第四个单元格为空白的所有行。每行可以有任意数量的单元格。

到目前为止我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace EpicRemoveBlankPriceRecords
{
    class Program
    {
        static void Main(string[] args)
        {
            string line;

            // Read the file and display it line by line.
            System.IO.StreamReader inFile = new System.IO.StreamReader("c:\\test\\test.txt");
            System.IO.StreamWriter outFile = new System.IO.StreamWriter("c:\\test\\test_out.txt");
            while ((line = inFile.ReadLine()) != null)
            {
                Match myMatch = Regex.Match(line, @".*\|.*\|.*\|\|.*");
                if (!myMatch.Success)
                {
                    outFile.WriteLine(line);
                }
            }

            inFile.Close();
            outFile.Close();

            //// Suspend the screen.
            //Console.ReadLine();


        }
    }
}

这行不通。我认为这是因为 RegEx 是“贪婪的”——如果有任何空白单元格,这匹配,因为我没有明确地说“捕获除了管道字符之外的所有内容”。一个快速的谷歌,我发现我可以在模式中使用 [^\|] 来做到这一点。

因此,如果我将模式更改为:

 ".*[^\|]\|.*[^\|]\|.*[^\|]\|\|.*"

为什么这也不起作用?

猜猜我有点困惑,任何指针将不胜感激。

谢谢!

4

3 回答 3

3

你真的需要正则表达式吗?

var lines = File.ReadLines(filename)
           .Where(line => !String.IsNullOrWhiteSpace(line.Split('|')[3]));

File.WriteAllLines(outfile, lines);
于 2013-08-21T14:09:04.090 回答
1

.*[^\|]表示零个或多个通配符 ( .*) 和一个不是|( [^\|]) 的字符。

另外,你需要逃到|里面[]

并且Regex.Match实际上并不匹配,它会搜索,因此您需要^在正则表达式的开头(表示字符串的开头)。

.*因此也不需要尾随。

相反,您想要零个或多个不是 的字符|,如下所示:

"^[^|]*\|[^|]*\|[^|]*\|\|"

测试

为什么".*\|.*\|.*\|\|.*"没有工作:

除了以上原因...

*贪婪并没有真正改变太多(你可以通过这样做使它变得不贪婪/懒惰.*?)。问题是它.也匹配|并且它回溯,因此.*将根据需要包含尽可能多或尽可能少|的 ' 以匹配字符串(是的,它会尝试包含更多,因为它是贪婪的,但这不会改变是否它找到了一些东西,只找到了它找到的东西)。

您可以使用惰性匹配和所有格量词一起破解某些东西,但它最终会变得更加复杂,更重要的是,我想 C# 不支持这些。

于 2013-08-21T14:06:19.050 回答
1

这似乎适用于正则表达式

^[^|]*\|[^|]*\|[^|]*\|\|.*
  • ^单独意味着行的开始
  • [^|]任何字符,除了|
  • [^|]*匹配零个或多个非|字符
  • + 可能不适合您的使用,但这意味着至少有一个,但它会发现更多
  • .*意味着任何东西,并且可以找到尽可能多的东西。

测试数据:

  • abc|123|234||673
  • abc|定义||123|456
  • abc|123|234|673||ab
于 2013-08-21T14:06:57.180 回答