我正在寻找一种解决方案,用于在C#中删除字符串中的第2行。当然,我可以逐行阅读,但使用正则表达式,它会更好,更优雅。举个例子:
在:
this is line 1
this is line 2
this is line 3
this is line 4
后:
this is line 1
this is line 3
this is line 4
有人对使用Regex如何做到这一点有一个很好的暗示吗? 感谢。
答案 0 :(得分:4)
如果您真的想要 可以使用正则表达式执行此操作:
s = Regex.Replace(s, @"\A(.*\n).*\n", "$1");
用于处理平台相关的行结尾:
Regex regex = new Regex(string.Format(@"\A(.*{0}).*{0}", Environment.NewLine));
s = regex.Replace(s, "$1");
但是我认为使用string.Split
然后重新加入会更清楚:
List<string> lines = s.Split(new string[]{ Environment.NewLine },
StringSplitOptions.None)
.ToList();
lines.RemoveAt(1);
// Note: In .NET 4.0 the ToArray call is not required.
string result = string.Join(Environment.NewLine, lines.ToArray());
我同意正则表达式更简洁,但不熟悉正则表达式语法的人(甚至是那些人)会更喜欢更明确的版本。
答案 1 :(得分:1)
我知道您要求使用正则表达式解决方案,但是当我说正则表达式不适合这项工作时,请不要拍摄信使。
通过将文件作为行读取并跳过第二个文件,您可以获得一个优雅的解决方案:
string fileContents =
String.Join(Environment.NewLine, File.ReadAllLines("filepath").Where((line, index) => index != 1));
答案 2 :(得分:0)
将正则表达式设置为“单行”模式,以禁用新行的处理。例如:
Regex r = new Regex(@"^[^\r\n]*\r\n([^\r\n]*\r\n)", RegexOptions.Singleline);
Match m = r.Match(myText);
String line 2 = null;
if (m.Success) {
line2 = m.Captures[1].Value;
myText = substring(myText, 0, m.Captures[1].Index) +
substring(myText, m.Captures[1].Index + m.Captures[1].Length);
}
// line2 will contain "this is line 2\r\n"
// myText will be all text except line2.