c# - Regex问题查找/显示行RichTextBoxes

本文关键字:显示 RichTextBoxes 查找 Regex 问题 | 更新日期: 2023-09-27 18:01:55

我要做的是格式化一个文件,并根据与。txt文件中的行匹配的正则表达式将其分类为3个不同的RichTextBoxes。

我打开的文本文件看起来像这样:

POS     INFO        XINFO    YINFO    INFO  whatIWantToMatch  
J6      INT-00113G  227.905  174.994  180   SOIC8     
J3      INT-00113G  227.905  203.244  180   SOIC8     
U13     EXCLUDES    242.210  181.294  180   QFP128    
U3      IC-00276G   236.135  198.644  90    BGA48     
U12     IC-00270G   250.610  201.594  0     SOP8      
J1      INT-00112G  269.665  179.894  180   SOIC16    
J2      INT-00112G  269.665  198.144  180   SOIC16    
C44     EXCLUDES    237.910  193.469  0     0603_5    
C45     EXCLUDES    244.102  193.387  0     0603_5    
C76     CAP-00117G  227.710  198.594  0     0603_5    
C13     EXCLUDES    245.044  191.416  90    0402_2    
R12     RES-00458G  246.560  202.694  90    0402_2  
下面是我的代码:
    private void GCFormatButton_Click(object sender, EventArgs e)
    {
        // Resets the text in the placement rich text boxes.
        placementOneRichTextBox.ResetText();
        placementTwoRichTextBox.ResetText();
        userDefinedRichTextBox.ResetText();
        formatHelper();
        listFormatHelper();
    }
    private void formatHelper()
    {
        try
        {
            // Reads the lines in the file to format.
            var fileReader = File.OpenText(openGCFile.FileName);
            // Creates lists for the lines to be stored in.
            var placementOneList = new List<string>();
            var placementTwoList = new List<string>();
            var placementUserDefinedList = new List<string>();
            // Reads the first line and does nothing with it.
            fileReader.ReadLine();
            // Adds each line in the file to the list.
            while (true)
            {
                var line = fileReader.ReadLine();
                if (line == null)
                    break;
                placementOneList.Add(line);
                placementTwoList.Add(line);
                placementUserDefinedList.Add(line);
            }
            // Handles all of the requirements for placement type one.
            placementOneList = findPackagePlacementOneType(placementOneList);
            // Prints the formatted refs to the richtextbox.
            foreach (var line in placementOneList)
                placementOneRichTextBox.AppendText(line + "'n");
            // Handles the requirements for placement type two.
            placementTwoList = findPackagePlacementTwoType(placementTwoList);
            // Prints the formatted refs to the richtextbox.
            foreach (var line in placementTwoList)
                placementTwoRichTextBox.AppendText(line + "'n");
            // Handles all of the requirements for placement type one.
            placementUserDefinedList = findPackagePlacementChoiceType(placementUserDefinedList);
            // Prints the formatted refs to the richtextbox.
            foreach (var line in placementUserDefinedList)
                userDefinedRichTextBox.AppendText(line + "'n");
        }
        // Catches an exception if the file was not opened.
        catch (Exception)
        {
            MessageBox.Show("Could not format the text.", "Formatting Text Error",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    private void listFormatHelper()
    {
        // Splits the lines in the rich text boxes
        var listOneLines = placementOneRichTextBox.Text.Split(''n');
        var listTwoLines = placementTwoRichTextBox.Text.Split(''n');
        var listUserLines = userDefinedRichTextBox.Text.Split(''n');
        // Resest the text in the listboxes
        placementOneListBox.ResetText();
        placementTwoListBox.ResetText();
        userDefinedListBox.ResetText();
        // Set the selection mode to multiple and extended.
        placementOneListBox.SelectionMode = SelectionMode.MultiExtended;
        placementTwoListBox.SelectionMode = SelectionMode.MultiExtended;
        userDefinedListBox.SelectionMode = SelectionMode.MultiExtended;
        //placementOneListBox.Data
        // Shutdown the painting of the ListBox as items are added.
        placementOneListBox.BeginUpdate();
        placementTwoListBox.BeginUpdate();
        userDefinedListBox.BeginUpdate();
        // Display the items in the listbox.
        placementOneListBox.DataSource = listOneLines;
        placementTwoListBox.DataSource = listTwoLines;
        userDefinedListBox.DataSource = listUserLines;
        // Allow the ListBox to repaint and display the new items.
        placementOneListBox.EndUpdate();
        placementTwoListBox.EndUpdate();
        userDefinedListBox.EndUpdate();
    }
    static List<string> findPackagePlacementOneType(List<string> list)
    {
        // Creates a new list to return with new format.
        var result = new List<string>();
        // Checks each line in the list.
        foreach (var line in list)
        {
            // PLACEMENT ONE Regex
            Match regexRES = Regex.Match(line, @"RES.*");
            Match regex0402 = Regex.Match(line, @"0603.*");
            Match regex0201 = Regex.Match(line, @"0201.*");
            Match regex0603 = Regex.Match(line, @"0603.*");
            Match regex0805 = Regex.Match(line, @"0805.*");
            Match regex1206 = Regex.Match(line, @"1206.*");
            Match regex1306 = Regex.Match(line, @"1306.*");
            Match regex1608 = Regex.Match(line, @"1608.*");
            Match regex3216 = Regex.Match(line, @"3216.*");
            Match regex2551 = Regex.Match(line, @"2551.*");
            Match regex1913 = Regex.Match(line, @"1913.*");
            Match regex1313 = Regex.Match(line, @"1313.*");
            Match regex2513 = Regex.Match(line, @"2513.*");
            Match regex5125 = Regex.Match(line, @"5125.*");
            Match regex2525 = Regex.Match(line, @"2525.*");
            Match regex5619 = Regex.Match(line, @"5619.*");
            Match regex3813 = Regex.Match(line, @"3813.*");
            Match regex1508 = Regex.Match(line, @"1508.*");
            Match regex6431 = Regex.Match(line, @"6431.*");
            Match regex2512 = Regex.Match(line, @"2512.*");
            Match regex1505 = Regex.Match(line, @"1505.*");
            Match regex2208 = Regex.Match(line, @"2208.*");
            Match regex1005 = Regex.Match(line, @"1005.*");
            Match regex1010 = Regex.Match(line, @"1010.*");
            Match regex2010 = Regex.Match(line, @"2010.*");
            Match regex0505 = Regex.Match(line, @"0505.*");
            Match regex0705 = Regex.Match(line, @"0705.*");
            Match regex1020 = Regex.Match(line, @"1020.*");
            Match regex1812 = Regex.Match(line, @"1812.*");
            Match regex2225 = Regex.Match(line, @"2225.*");
            Match regex5764 = Regex.Match(line, @"5764.*");
            Match regex4532 = Regex.Match(line, @"4532.*");
            Match regex1210 = Regex.Match(line, @"1210.*");
            Match regex0816 = Regex.Match(line, @"0816.*");
            Match regex0363 = Regex.Match(line, @"0363.*");
            Match regexSOT = Regex.Match(line, @"SOT.*");
            if (regexRES.Success || regex0402.Success || regex0201.Success || regex0603.Success ||
                regex0805.Success || regex1206.Success || regex1306.Success || regex1608.Success ||
                regex3216.Success || regex2551.Success || regex1913.Success || regex1313.Success ||
                regex2513.Success || regex5125.Success || regex2525.Success || regex5619.Success ||
                regex3813.Success || regex1508.Success || regex6431.Success || regex2512.Success ||
                regex1505.Success || regex2208.Success || regex1005.Success || regex1010.Success ||
                regex2010.Success || regex0505.Success || regex0705.Success || regex1020.Success ||
                regex1812.Success || regex2225.Success || regex5764.Success || regex4532.Success ||
                regex1210.Success || regex0816.Success || regex0363.Success || regexSOT.Success)
            {
                result.Add(string.Join(" ", line));
            }
            else
                result.Remove(line);
        }
        // Returns the new list so it can be formatted further.
        return result;
    }
    static List<string> findPackagePlacementTwoType(List<string> list)
    {
        // Creates a new list to return with new format.
        var result = new List<string>();
        // Checks each line in the list.
        foreach (var line in list)
        {
            // PLACEMENT TWO Regex
            Match regexBGA = Regex.Match(line, @"BGA.*");
            Match regexSOP8 = Regex.Match(line, @"SOP8.*");
            Match regexQSOP = Regex.Match(line, @"QSOP.*");
            Match regexTQSOP = Regex.Match(line, @"TQSOP.*");
            Match regexSOIC16 = Regex.Match(line, @"SOIC16.*");
            Match regexSOIC12Plus = Regex.Match(line, @"SOIC12.*");
            Match regexSOIC8 = Regex.Match(line, @"SOIC8.*");
            Match regexSO8 = Regex.Match(line, @"SO8.*");
            Match regexSO08 = Regex.Match(line, @"SO08.*");
            Match regexCQFP = Regex.Match(line, @"CQFP.*");
            Match regexLCC = Regex.Match(line, @"LCC.*");
            Match regexLGA = Regex.Match(line, @"LGA.*");
            Match regexOSCCC = Regex.Match(line, @"OSCCC.*");
            Match regexPLCC = Regex.Match(line, @"PLCC.*");
            Match regexQFN = Regex.Match(line, @"QFN.*");
            Match regexQFP = Regex.Match(line, @"QFP.*");
            Match regexSOJ = Regex.Match(line, @"SOJ.*");
            Match regexSON = Regex.Match(line, @"SON.*");
            if (regexBGA.Success || regexSOP8.Success || regexQSOP.Success || regexTQSOP.Success ||
               regexSOIC16.Success || regexSOIC12Plus.Success || regexSOIC8.Success || regexSO8.Success ||
               regexSO08.Success || regexCQFP.Success || regexLCC.Success || regexLGA.Success ||
               regexOSCCC.Success || regexPLCC.Success || regexQFN.Success || regexQFP.Success ||
               regexSOJ.Success || regexSON.Success)
            {
                result.Add(string.Join(" ", line));
            }
            else
                result.Remove(line);
        }
        // Returns the new list so it can be formatted further.
        return result;
    }
    static List<string> findPackagePlacementChoiceType(List<string> list)
    {
        // Creates a new list to return with new format.
        var result = new List<string>();
        // Checks each line in the list.
        foreach (var line in list)
        {
            // PLACEMENT ONE Regex
            Match regexCAP = Regex.Match(line, @"CAP.*");
            Match regexIND = Regex.Match(line, @"IND.*");
            Match regexMELF = Regex.Match(line, @"MELF.*");
            Match regexDIOM = Regex.Match(line, @"DIOM.*");
            Match regexSOD = Regex.Match(line, @"SOD.*");
            Match regexSTO = Regex.Match(line, @"STO.*");
            Match regexTO = Regex.Match(line, @"TO.*");
            if (regexCAP.Success || regexIND.Success || regexMELF.Success || regexDIOM.Success ||
               regexSOD.Success || regexSTO.Success || regexTO.Success)
            {
                result.Add(string.Join(" ", line));
            }
            else
                result.Remove(line);
        }
        // Returns the new list so it can be formatted further.
        return result;
    }

然而,对于我一直在使用的REGEX,我不能正确匹配我想要的。我想在文本文件"whatIWantToMatch"中匹配上面标记的文件的末尾。此外,由于某种原因,函数"findPackagePlacementChoiceType"得到一些与"findPackagePlacementOneType"相同的结果,它不应该是。


问题

  • 有什么建议,我如何能使更好的正则表达式?
  • 为什么finePackagePlacementChoiceType与findPackagePlaceMentOneType匹配相似的结果?
  • 为什么findPackagePlacementOneType(和其他函数)没有正确地抓住他们的匹配?
    • 我的意思是,它可能会抓住3个"603_5"结尾中的2个,而不是全部3个…?

c# - Regex问题查找/显示行RichTextBoxes

由于您想要放在同一组中的"whatIWantToMatch"值之间看起来没有太多共同之处,并且您也提前知道所有可能的值是什么,因此您可能需要考虑使用简单的if/else结构而不是正则表达式:

var placementOneList = new List<string>();
var placementTwoList = new List<string>();
var placementUserDefinedList = new List<string>();
// For each line in the file
foreach(string line in File.ReadAllLines("filename"))
{
    // Split the line to get only the "whatIWantToMatch" token
    // (Error handling omitted for simplicity)
    var match = line.Split(new String[] {" ", "'t"}, 
        StringSplitOptions.RemoveEmptyEntries)[5];
    // Put the line in the appropriate list depending upon its "whatIWantToMatch" value
    if(match.StartsWith("RES.") { placementOneList.Add(line); }
    else if(match.StartsWith("0603.") { placementOneList.Add(line); }
    // ...
    else if(match.StartsWith("BGA.") { placementTwoList.Add(line); }
    // ...
    else { throw new ApplicationException(); } // No match found
}

这行看起来不对:

Match regex0402 = Regex.Match(line, @"0603.*");

应该是:

Match regex0402 = Regex.Match(line, @"0402.*");

因为您只是对结果进行OR匹配,因此将返回与这些正则表达式中的任何一个匹配的任何行。您需要编写一个可能与行结构本身匹配的正则表达式。

例如:

J3 INT-00113G 227.905 203.244 180 SOIC8

可能与

这样的内容匹配
^('w+'d)'s('w-'d{5}'w)'s('d+'.'d+)'s('d+'.'d+)'s('d)'s('w{4}'d)

但是,如果不知道这些数据是如何变化的,我发现很难知道每行可能会有什么变化。查看msdn上关于正则表达式的文章,并构造一个匹配每一种行变化的正则表达式。

编辑

在仔细检查了你最初的问题之后,你想在每行的末尾匹配一个特定的字符串:

^.+(SOIC8)

匹配以SOIC8

结尾的行

为什么findPackagePlacementOneType(和其他函数)没有正确地抓住他们的火柴?

我刚刚注意到你的一些正则表达式字符串以。*结尾(它匹配任何字符,0次或更多次…)使用'.表示句号,如果它总是以数字结尾,请指定:'d