使用RegEx拆分然后截断列表中的行

时间:2012-02-01 17:12:45

标签: c# wpf regex list split

我几个小时以来一直在努力解决这个问题,并且批准我在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");
}

filterLabels中的RegEx我是在玩RegExBuddy而得到的,据说它应该可以正常工作。但实际上它并没有剥离任何东西。有人抓到我失踪的东西吗?

5 个答案:

答案 0 :(得分:1)

String是不可变的,Regex.Replace(line, filterLabels, "");不会修改原始line

详细了解MSDN

上的String
  

String被称为不可变的,因为它的值在创建后无法修改。

试试这个

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

希望这适合你。

答案 1 :(得分: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, "");                    
}

答案 2 :(得分: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();

答案 3 :(得分:0)

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

应该是

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

因为Regex.Replace没有替换内联。

您也可以尝试单次调用并摆脱循环

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

答案 4 :(得分: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);
        }