我几个小时以来一直在努力解决这个问题,并且批准我在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而得到的,据说它应该可以正常工作。但实际上它并没有剥离任何东西。有人抓到我失踪的东西吗?
答案 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);
}