使用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一起玩的,根据这一点,它应该很好。但事实上,它根本没有剥离任何东西。有人抓到我丢的东西了吗?
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);
}