2012-02-01 2 views
1

Я уже много часов борется с этим, и у меня есть проблемы с RegEx в любом случае, но независимо от того, что я не могу найти, моя ошибка. Моя цель состоит в том, чтобы иметь возможность разделять части строк, которые находятся в буфере обмена, вставляя только оставшуюся часть в различные текстовые поля. Формат в буфере обмена:Использование RegEx для разделения, а затем обрезания строк в списке

Рубрика: Информация

Рубрика: Информация

Информация

Рубрика: Информация

и т.д., и т.д., и т.д.

Мне нужна только информация для r emain, отсекая заголовок, двоеточие и пробелы. Код у меня до сих пор является:

string[] lines = null; 
object obj = this.Parent; 
StackPanel parent = (StackPanel)obj; 
ChildControls ccChildren = new ChildControls(); 

if (Clipboard.GetText().Contains('=')) 
{ 
} 
else if (Clipboard.GetText().Contains(':')) 
{ 
    string filterLabels = @"(?!\:)([^\:]*)$"; 
    lines = Regex.Split(Clipboard.GetText(), "\r\n"); 
    List<string> linesList = new List<string>(lines); 

    foreach (string line in linesList) 
    { 
     Regex.Replace(line, filterLabels, "");      
    } 
} 
else 
{ 
    lines = Regex.Split(Clipboard.GetText(), "\r\n"); 
} 

RegEx в filterLabels я получил от игры с RegexBuddy, и по тому, что он должен работать нормально. Но на самом деле это ничего не снимает. Кто-нибудь поймал то, что мне не хватает?

+0

Почему бы не фильтровать (Regex.Replace) до разделения? – Paparazzi

+0

Не является ли строка фильтра неправильной? Например,? является квантором. Поиск персонажа? вам нужно иметь \\? а не просто? – Pengtuzi

+1

Когда '?' Используется в начале группы (т. Е. После открытия скобки), это означает «сделать это незахваченной группой». Он на самом деле не пытается найти символы '?', Он говорит движку игнорировать первую группу. – ean5533

ответ

0

Только что понял, что я никогда не принимал ответа на этот вопрос, и я думал, что отправлю свое окончательное решение для кого-то другого, у которого есть аналогичная проблема. В конечном счете я взял несколько частей из этих ответов, и придумал следующее:

private void MultiPasteArrayGenerator() 
    { 
     string[] lines = null; 

     if (Clipboard.GetText().Contains('=')) 
     { 

     } 
     else if (Clipboard.GetText().Contains(':'))    //Strips headers from skip tools run through Agent Toolbox 
     {     
      string filterLabels = @"(?:\w+\s?)*\:(?:\s?)*";   //Set up RegEx statement 

      List<string> replacedLine = new List<string>(); 
      List<string> brokenLines = new List<string>(); 

      lines = Regex.Split(Clipboard.GetText(), filterLabels); //Divide text on clipboard into one string per line 
      foreach (string line in lines) 
      { 
       brokenLines.Add(line); 
      } 
      brokenLines.Remove(""); 
      string[] broken = brokenLines.ToArray(); 
      MultiPaste(broken); 
     } 
     else 
     { 
      lines = Regex.Split(Clipboard.GetText(), "\r\n"); 
      MultiPaste(lines); 
     } 
0

Строки неизменны в C#. Когда вы используете функцию типа Regex.Replace, она не изменяет исходную строку, она создает новую. Regex.Replace возвращает измененную строку, и вам нужно что-то сделать с ней.

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

foreach (string line in linesList) 
{ 
    line = Regex.Replace(line, filterLabels, "");      
} 

Но это не будет работать, потому что вы не можете изменить коллекции, которые вы Перебор с foreach цикла (по разным сложным причинам). Вместо этого вы должны будете использовать классический for цикл вроде этого:

for (int i = 0; i < linesList.Count; i++) 
{ 
    linesList[i] = Regex.Replace(linesList[i], filterLabels, "");      
} 
0

Сначала думаю, вы должны попробовать это line = Regex.Replace(line, filterLabels, "");

Или еще лучше:

List<string> linesList = new List<string>(); 

foreach (string line in lines) 
{ 
     lineList.Add(Regex.Replace(line, filterLabels, ""));      
} 

lines = lineList.ToArray(); 
+0

Это не скомпилируется - вы не можете изменять переменные итерации foreach. – ean5533

+0

да, я отредактировал мой ответ –

0
Regex.Replace(line, filterLabels, ""); 

должен быть

replacedLine = Regex.Replace(line, filterLabels, ""); 

как Regex.Replace не выполняет замену inline.

Вы также можете попробовать в одном вызове и избавиться от зацикливания

string str = Clipboard.GetText(); 
string filterLabels = @"^.+: "; 
string replacedStr = Regex.Replace(str, filterLabels, "", RegexOptions.Multiline); 
1

String неизменен, Regex.Replace(line, filterLabels, ""); не будет изменять оригинальный line.

Подробнее о String на MSDN

Строка называется неизменны, потому что его значение не может быть изменено, как только он был создан.

Попробуйте

List<string> list = new List<string>(); 
foreach (string line in lines) 
    list.Add(Regex.Replace(line, filterLabels, ""));      
lines = lineList.ToArray(); 

Надеется, что это работает для вас.

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