Использование RegEx для разделения, а затем усечения строк в списке - PullRequest
1 голос
/ 01 февраля 2012

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

Заголовок: информация

Заголовок: информация

Информация

Заголовок: информация

и т. д. и т. п.

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

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, и в соответствии с этим он должен работать нормально.Но на самом деле это ничего не лишает.Кто-нибудь поймает то, что мне не хватает?

Ответы [ 5 ]

1 голос
/ 01 февраля 2012

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

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

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

Попробуйте это

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

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

0 голосов
/ 17 марта 2012

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

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 голосов
/ 01 февраля 2012

Сначала подумайте, что вы должны попробовать это 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 голосов
/ 01 февраля 2012
Regex.Replace(line, filterLabels, "");   

должно быть

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

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

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

string str = Clipboard.GetText();
string filterLabels = @"^.+: ";
string replacedStr = Regex.Replace(str, filterLabels, "", RegexOptions.Multiline);
0 голосов
/ 01 февраля 2012

Строки неизменны в 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, "");                    
}
...