如何在文本文件c#中的字符串已知值之后查找和获取字符串

Posted

技术标签:

【中文标题】如何在文本文件c#中的字符串已知值之后查找和获取字符串【英文标题】:How to find and get string after a string known values in a text file 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

请帮帮我

谢谢!

【问题讨论】:

是否都保证在自己的线路上(在同一行之前或之后没有其他内容)?文件有多大(大约多少行)?这种情况多久会发生一次? 【参考方案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: (\d4)"。这意味着 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: (\d4)";

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

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

【讨论】:

以上是关于如何在文本文件c#中的字符串已知值之后查找和获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

关于如何使用一些已知的加密值查找解密公式的建议[关闭]

如何在 C# 数组中查找和显示特定值

查找 2 个已知值之间的字符串

excle vba,如何查找一个已知值的行号和列号?

如何检查 C# 中字符串的特定部分之后的字符?

如何在该行某处某处的某一行中的特定字符串之后从文本文件中获取一个数字?