正则表达式删除某个字符后的所有内容(评论)

时间:2011-10-30 06:56:39

标签: c# regex line character

我有一个正则表达式,我用来删除特定字符后的所有字符,分号。

        var regex = new Regex(@";(.*)", RegexOptions.Singleline);
        tb.Text = regex.Replace(tb.Text, "");

它似乎工作正常,但有时会删除文本框的整个文本。例如,删除了所有代码:

;fgkdfgdfgd
;dfgdfkghdfgdf
;sdgfsdfsdfsdf
;dfgdfgdfg

#dont remove this          ;fgdfgdfg

“#dont remove this”应保持原样,因为它不是在分号后,但它不是?我的正则表达式有问题吗?

想法是删除或修剪文件中的所有注释。

5 个答案:

答案 0 :(得分:5)

尝试(评论后更新):

tb.Lines = (
    from l in tb.Lines 
    let x = l.IndexOf (';') 
    select (x >= 0 ? l.SubString (0, x) : l)
).ToArray();

这应该比Regex跑得快......

答案 1 :(得分:2)

这是因为您使用RegexOptions.Singleline,因此.匹配新行。

答案 2 :(得分:2)

RegexOptions.Singleline不会将匹配限制为单行,如您所料。事实上,它的目的恰恰相反。它允许.元字符匹配换行符,使更容易查找跨越多行的匹配。放弃它,你应该没事。

答案 3 :(得分:1)

问题非常简单 - 你误解了RegexOptions.SingleLine

SingleLine告诉.可以匹配换行符的模式。 Read more about RegexOptions here

您当前的结果是一次匹配(从第一个;到整个字符串的结尾)。

您应该删除RegexOptions.SingleLine,您的模式会将每条评论与该行的末尾相匹配。

答案 4 :(得分:0)

您可以使用此功能轻松完成:

tb.Text = tb.Text.Substring(0, tb.Text.IndexOf(';'));

这应该比使用正则表达式运行得更快......

如果您的文本框是多行文件,则可以使用:

s = TextBox1.Text;
string ret = "";
s.Split('\n').ToList().ForEach(p=>ret += p.Substring(0, p.IndexOf(';')) + "\n");
TextBox1.Text = ret;