正则表达式:匹配行尾之前的文本

时间:2011-07-25 21:03:24

标签: regex text match text-files end-of-line

我有一个看起来像这样的文件:

J6      INT-00113G  227.905    5.994  180  ~!@#$%&^)
J3      INT-00113G  227.905 -203.244  180  12341341312315
U13     EXCLUDES    -42.210  181.294  180  QFP128
U3      IC-00276G     5.135  198.644  90   B%GA!@-48
U12     IC-00270G  -123.610 -201.594  0    SOP8_000
J1      INT-00112G  269.665  179.894  180  SOIC16_1
J2      INT-00112G  269.665  198.144  180  SOIC16-_2
..      ..........  .......  .......  ...  ................

我想匹配 第6列 中的结束值,以便从列表中删除它。第6列中的值的长度未确定,可以包含任何字符。所以我想做的是匹配空间之前的结束值。或者只是行尾。


CODE:

        // Reads the lines in the file to format.
        var fileReader = File.OpenText(filePath + "\\Remove Package 1 Endings.txt");

        // Creates a list for the lines to be stored in.
        var fileList = new List<string>();

        // Adds each line in the file to the list.
        while (true)
        {
            var line = fileReader.ReadLine();
            if (line == null)
                break;

            fileList.Add(line);
        }

        var mainResult = new List<string>();
        var theResult = new List<string>();

        foreach (var mainLine in fileList)
            mainResult.Add(string.Join(" ", mainLine));

        foreach (var theLine in mainResult)
        {
            // PLACEMENT ONE Regex
            Match theRegex = Regex.Match(theLine, @"insert the regex here!");

            if (theRegex.Success)
                theResult.Add(string.Join(" ", theLine));
        }

        // Removes the matched values from both of the Regex used above.
        List<string> userResult = mainResult.Except(theResult).ToList();

        // Prints the proper values into the assigned RichTextBoxes.
        foreach (var line in userResult)
            richTextBox2.AppendText(line + "\n");

我要做的是让文件看起来像这样:

J6      INT-00113G  227.905    5.994  180
J3      INT-00113G  227.905 -203.244  180
U13     EXCLUDES    -42.210  181.294  180
U3      IC-00276G     5.135  198.644  90
U12     IC-00270G  -123.610 -201.594  0
J1      INT-00112G  269.665  179.894  180
J2      INT-00112G  269.665  198.144  180

问题:

  • 有人可以为此提出正则表达式吗?

修改

添加代码:

        var lines = new List<string>(File.ReadAllLines(filePath + "\\Remove Package 1 Endings.txt"));
        for (int i = 0; i < lines.Count; i++)
        {
            var idx = lines[i].LastIndexOf(" ");

            if (idx != -1)
                lines[i] = lines[i].Remove(idx);

            richTextBox1.AppendText(lines[i] + Environment.NewLine
        }

3 个答案:

答案 0 :(得分:1)

\S+$应该执行,并启用多行功能。 (不确定你在C#中启用正则表达式标志到底是怎么回事?是吗?但是在字符串前加(?m)可以使用一些正则表达式引擎,虽然这不是唯一的方法。)

\S - 匹配任何非空白字符
+ - 表示前面的正则表达式元素应匹配一次或多次
$ - 表示匹配字符串的结尾,或者如果启用了多行,则表示行的结尾。

编辑:您正在单独检查每一行,因此无需担心多行内容。

(尽管正如其他人所说的那样,与正则表达式一起使用可能会使事情变得更加复杂。)

答案 1 :(得分:1)

我认为你让它变得比实际更复杂;例如,如果根据你的例子进行格式化,下面的内容可以帮助你删除数据的最后一部分,稍微调整一下,例如修剪(显然,缓解错误),我敢肯定这适合:

var lines = new List<string>(File.ReadAllLines(path));
for (int i = 0; i < lines.Count; i++) 
{
    var idx = lines[i].LastIndexOf(" ");   
    if (idx != -1)
    {     
        lines[i] = lines[i].Remove(idx);
    }
}

请注意,可以一次性读取文件的所有行,根据要加载的文件的大小,这并不总是需要的,但是我看到你正在加载每行。处理 - 在这种情况下,我们可以使整个事情更简洁。

答案 2 :(得分:0)

只是依赖于每个列由您可以使用的空格分隔的事实:

\s+([\S]*)$