C#获取以特定单词开头的多行字符串的行

4

我有一个多行字符串,比如说

abcde   my first line
fghij   my second line
klmno   my third line

所有这些都是一个字符串,但我现在想做的是获取从特定单词开始的该字符串的内容(子字符串),例如“fghij”。因此,如果我编写一个方法并将“fghij”传递给它,在这种情况下,它应该返回“fghij my second line”。

以下是我尝试过的,但很遗憾它不起作用,m.Success始终为false:

String getLineBySubstring(String myInput, String mySubstring)
    {
        Match m = Regex.Match(myInput, "^(" + mySubstring + "*)", RegexOptions.Multiline);
        Console.WriteLine("getLineBySubstring operation: " + m.Success);
        if (m.Success == true)
        {
            return m.Groups[0].Value;
        }
        else
        {
            return "NaN";
        }
    }
4个回答

5
< p > * 操作符当前量化的是 mySubstring 中的最后一个字母。你需要在操作符前面加上 .,以吃掉给定行中剩余的所有字符。也不需要进行分组。< /p >
Match m = Regex.Match(myInput, "^" + mySubstring + ".*", RegexOptions.Multiline);
if (m.Success) {
   // return m.Value
} 

Ideone演示


2

您已经快完成了,只需将*字符更改为[^\r\n]+

Match m = Regex.Match(myInput, "^(" + mySubstring + "[^\n\r]+)", RegexOptions.Multiline);

[^\r\n]+将匹配任何字符,但不包括用于标记新行的\r\n


1
尝试在你的正则表达式中添加换行符$。同时,将*连接到mySubstring上会重复mySubstring中的最后一个符号,你应该使用.*来捕获所有可能的符号。
Regex.Match(myInput, "^(" + mySubstring + ".*)$", RegexOptions.Multiline);

1
如果您需要检查字符串是否以某个子字符串开头,则应避免使用正则表达式。只需将整个字符串拆分成行,并使用StartsWith检查每一行即可。
String getLineBySubstring(String myInput, String mySubstring)
    {
        string[] lines = myInput.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var line in lines)
            if (line.StartsWith(mySubstring))
                return line;
        return "NaN";            
    }

你能否在你的建议中加入更多的理由呢?(我也很想知道有哪些好处) - Uladzislaŭ
只有简单。有些人面对问题时,会想:“我知道,我会用正则表达式。”现在他们有两个问题了。 - Denys Kazakov
正则表达式只是文本处理的工具,因此在处理文本(如检索当前问题中的某些表达式)时,最好使用专为此任务设计的工具,而不是手动字符串拆分。(我不能说您的代码对当前任务更差,但避免使用正则表达式的建议相当绝对) - Uladzislaŭ
1
拥有解决问题的替代方法是很好的。我记得在大学时做过一项练习,要处理文本任务,但明确禁止使用正则表达式。 - Orsinus

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