使用正则表达式来分割,然后截断列表中的行

问题描述:

我一直在努力挣扎几个小时,并且授予我正确的RegEx问题,但不管我看起来不能找到我的错误。我的目的是能够将剪贴板上的部分行删除,只将剩余部分粘贴到各种文本框中。剪贴板上的格式是:使用正则表达式来分割,然后截断列表中的行

标题:信息

标题:信息

信息

标题:信息

等,等,等

我只需要r的信息emain,剥离Header,冒号和空格。我迄今的代码是:

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我从使用RegexBuddy玩,并根据它应该正常工作了。但实际上它根本不剥夺任何东西。任何人都会抓到我失踪的东西?

+0

为什么不在筛选之前过滤(Regex.Replace)? – Paparazzi 2012-02-01 17:38:50

+0

是不是过滤器字符串错了?例如?是一个量词。要搜索角色?你需要有\\?而不只是? – Pengtuzi 2012-02-01 17:18:53

+1

当在组的开始处使用“?”(即在左括号后)时,意味着“使其成为非捕获组”。他实际上并不是在寻找'?'字符,而是在告诉引擎忽略第一组。 – ean5533 2012-02-01 17:22:36

刚刚意识到我从来没有接受过这个答案,我想我会发布我的最终解决方案给任何其他有类似问题的人。最终我从几个这些答案中拿了点零零碎碎的东西,然后想出了这个:

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

字符串在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, "");      
} 

首先想你应该尝试是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 2012-02-01 17:23:38

+0

是的,我编辑了我的答案 – 2012-02-01 17:24:44

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

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

希望这个作品给你。