获取某个短语后的字符串/文本

时间:2018-05-25 09:51:46

标签: c# indexof

我需要从日志文件中获取“运行模块”之后的单词。 “运行模块”之后的单词始终以句号结束(。) 我需要在数组中插入这个单词,以便以后在需要时访问。

日志中的示例文本是:

  

25.5.2018 10:42:35.621状态消息0884:运行模块SamplesSim。

     

25.5.2018 10:42:35.621状态消息0120:数据输入:打开:T:\ RCS \ BiggieStatementsOn \ PRINT \ INPUTJACK \ FCA_HomeBandAccounts_23052018.csv。 (DataInput1)

我已尝试使用indexOf(),但我一直以“运行”作为输出。

这是我的代码:

string consoleOutput = compiler.StandardOutput.ReadToEnd();

startIndex = consoleOutput.IndexOf("Running module");
string[] ModuleParams;
string runningMod = "";

if (startIndex != -1)
{
    lastIndex = startIndex +3;
    if (lastIndex != -1)
    {
        ModuleParams = consoleOutput
                           .Substring(startIndex, lastIndex - startIndex)
                           .Split(' ');

        runningMod = ModuleParams[0];
                     //.Substring(4).Replace("Running module", "").Trim();
    }                                
    Console.WriteLine(runningMod);
}

4 个答案:

答案 0 :(得分:2)

我更正了您的代码,现在输出SamplesSim

using System;

public class Program
{
    public static void Main()
    {
            string consoleOutput = @"
                25.5.2018 10:42:35.621 Status message 0884:Running module SamplesSim.

                25.5.2018 10:42:35.621 Status message 0120:Data Input: Opening: T:\RCS\BiggieStatementsOn\PRINT\INPUTJACK\FCA_HomeBandAccounts_23052018.csv. (DataInput1)
            ";
            string wordToFind = "Running module";
            var startIndex = consoleOutput.IndexOf(wordToFind);
            string[] ModuleParams;
            string runningMod = "";

            if (startIndex != -1)
            {
                var lastIndex = startIndex + wordToFind.Length;
                if (lastIndex != -1)
                {
                    ModuleParams = consoleOutput
                                       .Substring(startIndex+wordToFind.Length, consoleOutput.Length - (startIndex+wordToFind.Length))
                        .Split(new char[]{' ','\n','.'}, StringSplitOptions.RemoveEmptyEntries);

                    runningMod = ModuleParams[0];
                                 //.Substring(4).Replace("Running module", "").Trim();
                }                                
                Console.WriteLine(runningMod);
            }
    }
}

答案 1 :(得分:0)

可能有更简洁的方法,但这应该有效。

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1].Split('.')[0];

因此,我通过字符串“Running module”拆分控制台输出,并将文本放在拆分的右侧。然后我再次以“。”分裂。并取左侧的值。这非常混乱,所以我会留意改进。

编辑:忘记提及,您可能需要从字符串的开头修剪空格,就好像您有“运行模块重命名器”之类的东西,分割后的输出将是“重命名”。您可以使用text = text.Trim();删除所有空格,或text = text.TrimStart();从一开始就删除空格。或者,您可以在上面代码的末尾添加它,但我听说这是不好的做法。

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1].Split('.')[0].Trim();

最好将它展开一点

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1];
text = text.Split('.')[0];
text = text.Trim();

答案 2 :(得分:0)

请尝试以下操作。

string mystring = "25.5.2018 10:42:35.621 Status message 0884:Running module SamplesSim.";
string keyWord = "Running module";
string extractedWord = mystring.Substring(mystring.IndexOf(keyWord) + keyWord.Length).Trim();
Console.WriteLine(extractedWord);

上面的代码将返回SampleSim它还会删除字符串中的任何空格。

答案 3 :(得分:0)

您可以使用正则表达式。见https://regex101.com/r/Xm25z5/1

/Running module\s[a-zA-Z]+.$/gm