如何从多行文本中仅获取第一行?

16

如何使用正则表达式获取多行文本的第一行?

        string test = @"just take this first line
        even there is 
        some more
        lines here";

        Match m = Regex.Match(test, "^", RegexOptions.Multiline);
        if (m.Success)
            Console.Write(m.Groups[0].Value);
4个回答

40

如果您只需要第一行,可以不使用正则表达式进行操作,如下所示

var firstline = test.Substring(0, test.IndexOf(Environment.NewLine));

尽管我很喜欢正则表达式,但并非所有情况都需要使用它们。因此,除非这是某个更大的正则表达式练习的一部分,否则在这种情况下我会选择更简单的解决方案。


6
这是最佳解决方案。对于这么简单的任务不需要正则表达式,而且这也很高效。 - Noldorin
2
@Matthew:确实,但是当回答时,我们也应该考虑有用的替代方案吧? - Brian Rasmussen
1
如果文本可能来自另一个环境,例如邮件正文,该怎么办? - nakhli
1
@evolutionxbox 那么你的输入可能不包含 Environment.NewLine。请记住,不同的平台对换行符的处理方式是不同的。 - Brian Rasmussen
1
如果多行文本中只有一行,则会导致ArgumentOutOfRangeException。如果您选择这种方法,您需要先检查其是否存在... - ѺȐeallү
显示剩余9条评论

11
string test = @"just take this first line
even there is 
some more
lines here";

Match m = Regex.Match(test, "^(.*)", RegexOptions.Multiline);
if (m.Success)
    Console.Write(m.Groups[0].Value);

.经常被称为匹配任何字符,但这并不完全正确。只有在使用RegexOptions.Singleline选项时,.才匹配任何字符。如果没有此选项,则它匹配除'\n'(行尾)之外的任何字符。

话虽如此,更好的选择可能是:

string test = @"just take this first line
even there is 
some more
lines here";

string firstLine = test.Split(new string[] {Environment.NewLine}, StringSplitOptions.None)[0];
并且更好的是,Brian Rasmussen 的版本:
string firstline = test.Substring(0, test.IndexOf(Environment.NewLine));

1
你的替代方案做了很多其实并不必要的工作。如果测试像示例中那样很短,可能不会有问题,但对于一个大型多行字符串来说,这是一种浪费。 - Brian Rasmussen
@Brian,我同意。我没有将其更改为复制您的希望您的被接受,但我现在想“借用”它。 - Matthew Scharley
在Windows中,给定的测试字符串在每行末尾都包含回车和换行符("\r\n")。使用RegexOptions.Multiline选项和"^(.*)"将回车符包含在捕获组中。如果不想要这个回车符,请改用"^([^\r]*)"(假设您可以保证'\r'只出现在预期的位置,即与伴随的'\n'一起出现)。 - wardies
@BrianRasmussen的解决方案(在此答案中引用)将会在输入字符串不包含换行符时抛出一个“异常”! - Shiva

1

试试这个:

Match m = Regex.Match(test, @".*\n", RegexOptions.Multiline);

0

这种行会用空字符串替换换行符后面的所有文本。

test = Regex.Replace(test, "(\n.*)$", "", RegexOptions.Singleline);

如果字符串中没有换行符,那么这也会正常工作 - 那么就不会进行替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接