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

本文关键字:列表 RegEx 拆分 然后 使用 | 更新日期: 2023-09-27 18:22:04

我已经为此挣扎了几个小时,当然我在RegEx方面也有问题,但不管怎样,我似乎都找不到我的错误。我的目的是能够剥离剪贴板上的部分行,只将剩余部分粘贴到各种文本框中。剪贴板上的格式为:

标题:信息

标题:信息

信息

标题:信息

等等

我只需要保留信息,去掉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中的RegEx是我和RegExBuddy一起玩的,根据这一点,它应该很好。但事实上,它根本没有剥离任何东西。有人抓到我丢的东西了吗?

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

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

在MSDN 上阅读有关String的更多信息

字符串被称为不可变的,因为一旦创建它,就不能修改它的值。

试试这个

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

希望这对你有用。

首先认为应该尝试的是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();
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);

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

我刚刚意识到我从未接受过这个问题的答案,我想我会为其他有类似问题的人发布我的最终解决方案。最终,我从其中几个答案中提取了一些零碎的东西,并得出了这个:

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