我正在使用WinForms NET 2.0。我正在编写一个小函数来修剪某些选定文本的注释。它的作用是用单独的行分割选定的文本,然后:
这是我的代码:
string[] lines = tb.SelectedText.Split('\n');
StringBuilder sb = new StringBuilder();
for (int i = 0; i < lines.Length; i++)
{
if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$"))
{
if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
else
sb.AppendLine(lines[i]);
}
}
tb.SelectedText = sb.ToString();
问题是,它没有按预期工作。假设我有以下文字:
test ;test
test2 ;test
我希望这可以修剪注释并删除空行,但不是,空白行仍然存在。为什么是这样?我检查了该行是否为空,所以如果该行为空,则StringBuilder不应该附加该行,但由于某种原因,它会这样做。
此外,由于某种原因,stringbuilder会附加一行。如何摆脱它?
答案 0 :(得分:3)
替换||在&amp;&amp;的if语句中并使用“\ r \ n”而不是“\ n”。试试这个:
var lines = textBox2.SelectedText.Split(new [] {"\r\n"}, StringSplitOptions.None);
var sb = new StringBuilder();
for (int i = 0; i < lines.Length; i++)
{
var line = lines[i].Trim();
if ((line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$"))
{
if (Regex.IsMatch(line, @"^(.*);(.*)$"))
sb.AppendLine(line.Substring(0, line.IndexOf(';')).Trim());
else
sb.AppendLine(line);
}
}
textBox2.SelectedText = sb.ToString();
或者使用LinQ和“?:”表达式:
var lines = textBox2.SelectedText .Split(new [] {"\r\n"}, StringSplitOptions.None);
var sb = new StringBuilder();
foreach (var line in lines.Select(t => t.Trim())
.Where(line => (line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$")))
{
sb.AppendLine(Regex.IsMatch(line, @"^(.*);(.*)$") ? line.Substring(0, line.IndexOf(';')).Trim() : line);
}
textBox2.SelectedText = sb.ToString();
答案 1 :(得分:1)
您的逻辑存在问题
if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$")) {
if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
else
sb.AppendLine(lines[i]);
}
当字符串不为空时输入if
或它与正则表达式不匹配。这意味着你一直输入它,因为当第一部分为假(字符串为空)时,第二部分为真(空字符串与正则表达式不匹配。)
只需用AND替换OR。