我有一个正则表达式,我用来删除特定字符后的所有字符,分号。
var regex = new Regex(@";(.*)", RegexOptions.Singleline);
tb.Text = regex.Replace(tb.Text, "");
它似乎工作正常,但有时会删除文本框的整个文本。例如,删除了所有代码:
;fgkdfgdfgd
;dfgdfkghdfgdf
;sdgfsdfsdfsdf
;dfgdfgdfg
#dont remove this ;fgdfgdfg
“#dont remove this”应保持原样,因为它不是在分号后,但它不是?我的正则表达式有问题吗?
想法是删除或修剪文件中的所有注释。
答案 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;