2011-07-25 3 views
0

У меня есть файл, который выглядит следующим образом:Regex: Сопоставьте текст до конца строки

J6  INT-00113G 227.905 5.994 180 [email protected]#$%&^) 
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%[email protected] 
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-м столбце не определена и может содержать любой символ. Так что я хотел бы сделать, это совпадение с конечным значением до пространства. или просто конец линии.


КОД:

 // 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 

ВОПРОС:

  • Может кто-нибудь поможет придумать регулярное выражение для этого?

EDIT:

ADDED КОД:

 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

У вас есть табличный формат и вы хотите удалить последний столбец? зачем вы хотите использовать регулярное выражение для этого? Я не знаю, C# (я считаю, что это так), но, безусловно, он должен иметь метод * string split *. – mhyfritz

+0

@mhyfritz: могу ли я сделать что-то вроде этого: 'foreach (var theLine в mainResult) {theLine.Split (''); theResult.Add (string.Join (theLine [0] + theLine [1] + theLine [2] + theLine [3] + theLine [4]));} '? – theNoobGuy

+1

Как уже упоминалось, я не знаю C#, поэтому вы сами по себе с синтаксисом, но да, просто разделите каждую строку пробелом '' ''и отбросьте последнее поле. – mhyfritz

ответ

1

\S+$ должны делать это с поддержкой многострочного функциональность. (Не знаете, как именно вы включаете флагов регулярного выражения в ... C#, не так ли ?, но добавление (?m) к строке работает с некоторыми двигателями регулярных выражений, хотя это не единственный способ сделать это.) .

\S - соответствует любому символу
+ - указывает на то, что предыдущее регулярное выражение элемент должен быть согласован один или несколько раз
$ - указывает на соответствие до конца строки или конца строки, если многострочную включен.

EDIT: Вы проверяете каждую линию по отдельности, поэтому вам не нужно беспокоиться о многострочном материале.

(Хотя, как утверждают другие, использование регулярного выражения для этого, вероятно, делает вещи более сложными, чем необходимо.)

+0

Спасибо .. Да, я думаю, что понимаю, что сейчас .. :) – theNoobGuy

0

Только опираясь на тот факт, что каждый столбец отделяется пробелами вы можете использовать:

\s+([\S]*)$ 
+0

Спасибо, но я думаю, что попробую более простой способ, чем REGEX. – theNoobGuy

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); 
    } 
} 

Обратите внимание, что можно читать все строки файла одним махом, это не всегда желательно в зависимости от размера загружаемого файла, но я вижу, что вы загружаете каждую из строк в любом случае перед обработкой - в этом случае мы можем просто сделать все более кратким.

+0

Я получаю сообщение об ошибке: ** «StartIndex не может быть меньше нуля. Имя параметра: startIndex» ** на строке 'lines [i] = lines [i] .Remove (idx);'. Я также добавил строку 'richTextBox1.AppendText (lines +" \ n ");' к вашему коду выше .. – theNoobGuy

+0

@Colton Да, для предотвращения ошибки потребуется правильная проверка; в этом случае это будет 'idx! = -1'. –

+0

@Colton Кроме того, 'lines +" \ n "' не будет работать, поскольку 'lines' является' List ', вы используете' lines [i] '. Еще лучше, используйте 'lines [i] + Environment.NewLine'. –

Смежные вопросы