【问题标题】:How to find and get string after a string known values in a text file c#如何在文本文件c#中的字符串已知值之后查找和获取字符串
【发布时间】:2021-10-11 18:01:23
【问题描述】:

我想用c#在文本文件中查找并获取字符串已知值之后的字符串

我的文本文件:

function PreloadFiles takes nothing returns nothing

call Preload(  "=== Save ===" )
call Preload( "Player: Michael" )
call Preload( "-load1 UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F" )
call Preload( "-load2 IMdOIPKGSDFXStx4Zd4LAvAaBmHW19rxsvSNF6kaObSFyBzGq8skYGuq0T1eW" )
call Preload( "-load3 Bd6MoyqnfDydBbwqGApWii3mabJpwNvjcwrKLI0r6UU2wadrMV1h7WQ8D6" )
call Preload( "-load4 D5kI18Flk5bJ4Oi7vQw33b5LHDXHGgJNYsiC6VNJDAHe1" )
call Preload(  "KEY PASS: 3568" )

endfunction

我想在字符串 "-load1" ,"-load2" ,"-load3" ,"-load4" ,"KEY PASS: " 之后获取字符串并将它们填充到 5 个文本框

这样

UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F
IMdOIPKGSDFXStx4Zd4LAvAaBmHW19rxsvSNF6kaObSFyBzGq8skYGuq0T1eW
Bd6MoyqnfDydBbwqGApWii3mabJpwNvjcwrKLI0r6UU2wadrMV1h7WQ8D6
D5kI18Flk5bJ4Oi7vQw33b5LHDXHGgJNYsiC6VNJDAHe1
3568

请帮帮我

谢谢!

【问题讨论】:

  • 是否都保证在自己的线路上(在同一行之前或之后没有其他内容)?文件有多大(大约多少行)?这种情况多久会发生一次?

标签: c# regex string winforms


【解决方案1】:

你可以使用

string Substring (int startIndex);

喜欢:

string in1 = "-load1 UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F";
string out = in1.substring(7);

它返回:

"UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F"

【讨论】:

    【解决方案2】:

    可以使用Regex 类(来自System.Text.RegularExpressions 命名空间)。

    模式示例:

    • 对于-loadN ... 字符串:" [A-Za-z0-9]*\" "。这意味着正则表达式应该查找以空格" " 开头的子字符串,其中包含一定数量的字符(A-z)(任何情况下)或数字(0-9),并以双引号\" 和空格" " 结尾。比如你的 UvjkiJyjLlP..."
    • 对于KEY PASS: ... 字符串:@"KEY PASS: (\d{4})"。这意味着 Regex 应该找到一个子字符串,其中包含 "KEYPASS: " 文本和一些 string of 4 digits 以及它们之间的空格 " "

    但是意识到,它非常不安全,因为正则表达式模式非常敏感。 例如,

    • "-loaddd1 AbCdEfG..."(额外字符)
    • "-load1 AbCdEfG..."(多个空格)
    • "KEY PASS: 12345"(下面示例中的模式严格来说只适用于 4 位,而不是 5 位或更多或更少)
    • "-LOAD1 AbCdEfG..."(大写) 等

    这些将被忽略(最后,顺便说一句,可以通过将RegexOptions.IgnoreCase 传递给Regex.Match(line, pattern, RegexOptions.IgnoreCase) 来解决)。其他也可以解决,但你应该知道这种情况是可能的。

    对于提供的有问题的示例,此代码可以正常工作:

    string loadPattern = " [A-Za-z0-9]*\" ";
    string keyPassPattern = @"KEY PASS: (\d{4})";
    
    List<string> capturedValues = new List<string>();
    
    foreach (string line in File.ReadAllLines("Preload.txt"))
    {
        string s;
    
        if (Regex.IsMatch(line, loadPattern) && line.Contains("-load"))
        {
            // Getting captured substring and trimming from trailing whitespace and quote
            s = Regex.Match(line, loadPattern, RegexOptions.IgnoreCase).Value.Trim('\"', ' '); 
            capturedValues.Add(s);
        }
        else if (Regex.IsMatch(line, keyPassPattern))
        {
            // Just replacing "KEY PASS: " to empty string
            s = Regex.Match(line, keyPassPattern).Value.Replace("KEY PASS: ", ""); 
            capturedValues.Add(s);
        }
    }
    

    结果:

    【讨论】:

    • 谢谢你,这对我有用!
    【解决方案3】:
    string s1 = "-load1 UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F";
    
    String filter = s1.ToString();
    
    String[] filterRemove = filter.Split(' ');
    
    String Value1= filterRemove[1];
    

    这样,你会得到 "UvjkiJyjLlPN1o7FCAwQ0en80t769u5uBKAL1t0u0Cajk86WNmp83F" 在值1

    你可以用同样的方式处理所有字符串并将它们组合起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多