如何在文本文件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#中的字符串已知值之后查找和获取字符串的主要内容,如果未能解决你的问题,请参考以下文章