用Regex从字符串中剪出一行

时间:2011-02-28 16:41:08

标签: c#

我正在寻找一种解决方案,用于在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如何做到这一点有一个很好的暗示吗? 感谢。

3 个答案:

答案 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.

参见http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemtextregularexpressionsregexoptionsclasstopic.asp  寻求更多帮助。