Регулярное выражение, соответствующее определенному числу в тексте - PullRequest
2 голосов
/ 25 июля 2011

У меня есть файл, который выглядит так:

STUFF   STUFF       **X**     **Y**  STUFF STUFF
J6      INT-00113G  227.905    5.994  180  SOIC8    
J3      INT-00113G  227.905 -203.244  180  SOIC8     
U13     EXCLUDES    -42.210  181.294  180  QFP128    
U3      IC-00276G     5.135  198.644  90   BGA48     
U12     IC-00270G  -123.610 -201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    

И мне нужно отдельно взять 3-й столбец и 4-й столбец и сохранить их в виде списка на C #.


В настоящее время я сопоставляю 3-й и 4-й столбцы вместе , используя:

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

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

        foreach (var xyLine in mainResult)
        {
            Match xyRegex = Regex.Match(xyLine, @"[\d]+\.[\d]+\s+[\d]+\.[\d]+");

            if (xyRegex.Success)
            {
                xyResult.Add(string.Join(" ", xyRegex));
            }
        }

        List<string> finalXYResult = xyResult.ToList();

        foreach (var line in finalXYResult)
            displayXYRichTextBox.AppendText(line + "\n");

Сейчас я сохраняю регулярное выражение, совпадающее с X и Y , в список one . Я хотел бы хранить два значения столбца отдельно. Итак , один список для X и один список для Y .


ВОПРОС:

  • Какое регулярное выражение я могу использовать, чтобы сопоставить 3-й столбец чисел и сохранить его в "X" , а также (или отдельно с помощью другого регулярного выражения) 4-й столбец чисел и сохраните его в «Y» ?

EDIT:

    private void calculateXAndYPlacementTwo()
    {
        // Reads the lines in the file to format.
        var fileReader = File.OpenText(filePath + "\\Calculating X,Y File.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);
        }

        // Creates new lists to hold certain matches for each list.
        var xyResult = new List<string>();
        var mainResult = new List<string>();
        var xResult = new List<string>();
        var yResult = new List<string>();

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

        mainResult.ForEach(xyLine =>
        {
            Match xyRegex = Regex.Match(xyLine, @"(?<x>-?\d+\.\d+)\s+(?<y>-?\d+\.\d+)");
            if (xyRegex.Success)
            {
                String xValue = xyRegex.Groups["x"].Value;
                String yValue = xyRegex.Groups["y"].Value;

                xyResult.Add(String.Join(" ", new[]{ xValue, yValue }));

                foreach (var line in xValue)
                    richTextBox1.AppendText(line + "\n");

                foreach (var line in yValue)
                    richTextBox2.AppendText(line + "\n");
            }
        });
    }

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Чтобы упростить задачу, я назвал группы, но должно работать следующее:

(?<x>-?\d+\.\d+)\s+(?<y>-?\d+\.\d+)

Обратите внимание, что для этого требуется, чтобы в 3-м и 4-м столбце были десятичные числа (я не делаюлюбая проверка для принятия целых или десятичных чисел, но при необходимости это может быть добавлено).

Обратите внимание, что выше было проверено на работу.

Резюме

В основном мы используем полученную вами запись, но расширяем ее, используя группы захвата (круглые скобки).Я также использую именованные группы (?<x> и ?<y> в начале группы), чтобы вы могли ссылаться на найденные значения, используя xyRegex.Groups["x"] и xyRegex.Groups["y"] соответственно.

Я также нашел ваш захватне удалось, когда числа появились с отрицательными значениями, поэтому я добавил необязательный отрицательный символ (-?) к шаблону, чтобы учесть это.

Итак, с разбивкой, вот утверждение:

(?<x>              # Begin capture group "x"
  -?                 # allow a negative symbol 0 or 1 time
  \d+                # allow 1+ numbers
  \.                 # allow a single decimal
  \d+                # allow decimal numbers 1+ times
)                  # end capture group "x"
\s+                # allow white space between the number sets
(?<y>              # Begin capture group "y"
  -?                 # \
  \d+                #  | - same as above
  \.                 #  |
  \d+                # /
)                  # End capture group "y"
0 голосов
/ 25 июля 2011

Вам просто нужно использовать группы регулярных выражений, а затем получить отдельные элементы из результата сопоставления.

foreach (var xyLine in mainResult) {
    //PLACEMENT TWO Regex
    Match xyRegex = Regex.Match(xyLine, @"([\d]+\.[\d]+)\s+([\d]+\.[\d]+)");

    if (xyRegex.Success) {
        xResult.Add(xyRegex.Groups[1].Value);
        yResult.Add(xyRegex.Groups[2].Value);
    }
}
...