使用正则表达式来分割,然后截断列表中的行
我一直在努力挣扎几个小时,并且授予我正确的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玩,并根据它应该正常工作了。但实际上它根本不剥夺任何东西。任何人都会抓到我失踪的东西?
刚刚意识到我从来没有接受过这个答案,我想我会发布我的最终解决方案给任何其他有类似问题的人。最终我从几个这些答案中拿了点零零碎碎的东西,然后想出了这个:
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();
这将不会编译 - 你不能改变'foreach'迭代变量。 – ean5533 2012-02-01 17:23:38
是的,我编辑了我的答案 – 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();
希望这个作品给你。
为什么不在筛选之前过滤(Regex.Replace)? – Paparazzi 2012-02-01 17:38:50
是不是过滤器字符串错了?例如?是一个量词。要搜索角色?你需要有\\?而不只是? – Pengtuzi 2012-02-01 17:18:53
当在组的开始处使用“?”(即在左括号后)时,意味着“使其成为非捕获组”。他实际上并不是在寻找'?'字符,而是在告诉引擎忽略第一组。 – ean5533 2012-02-01 17:22:36