从文件 C# 获取文本
本文关键字:取文本 获取 文件 | 更新日期: 2023-09-27 18:30:57
我正在逐行读取文本文件,并且我想在检查行是否包含特殊字符后获取特殊字符之间的数据。就我而言,我想检查行是否包含<#Tag()>
,如果它包含,则在 () 之间获取字符串,即行具有<#Tag(param1)>
,那么它应该返回param1
但问题是行可能包含不止一个<#Tag()>
例如,行具有 - <#Tag(value1)> <#Tag(value2)> <#Tag(value3)>
然后它应该首先返回value1
然后返回value2
然后value3
string contents = File.ReadAllText(@"D:'Report Format.txt");
int start = contents.IndexOf("Header") + "Header".Length;
int end = contents.IndexOf("Data") - "Header".Length;
int length = end - start;
string headerData = contents.Substring(start, length);
headerData = headerData.Trim(' ', '-');
MessageBox.Show(headerData);
using (StringReader reader = new StringReader(headerData))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.Contains("<#Tag"))
{
string input = line;
string output = input.Split('<', '>')[1];
MessageBox.Show(output);
Globals.Tags.SystemTagDateTime.Read();
string newoutput = Globals.Tags.SystemTagDateTime.Value.ToString();
input = input.Replace(output, newoutput);
input = Regex.Replace(input, "<", "");
input = Regex.Replace(input, ">", "");
MessageBox.Show(input);
}
}
}
尝试关注
var matches = Regex.Matches(line, @"(?<='<'#Tag'()'w+(?=')'>)")
foreach (Match match in matches)
MessageBox.Show(match.Value);
如果您想完成注释中描述的上下文,请尝试以下操作。
var line = "<#Tag(value1)> <#Tag(value2)> <#Tag(value3)>";
var matches = Regex.Matches(line, @"(?<='<'#Tag'()'w+(?=')'>)");
//use matches in your case to find values. i assume 10, 20 , 30
var values = new Dictionary<string, int>() { { "value1", 10 }, { "value2", 20 }, { "value3", 30 } };
const string fullMatchRegexTemplate = @"'<'#Tag'({0}')'>";
foreach (var value in values)
Regex.Replace(line, string.Format(fullMatchRegexTemplate, value.Key), value.Value.ToString());
这可能会为您解决问题
[^a-zA-Z0-9]
基本上它匹配所有非字母数字字符。
private void removeTag()
{
string n = "<#Tag(value1)> <#Tag(value2)> <#Tag(value3)>";
string tmp = Regex.Replace(n, "Tag+", "");
tmp = Regex.Replace(tmp, "[^0-9a-zA-Z]+", ",") ;
}
另一个可能是
string tmp = Regex.Replace(n, "[^0-9a-zA-Z]*[Tag]*[^0-9a-zA-Z]", ",");
您可以使用正则表达式执行此操作(我将处理一个) - 但作为一个简单的快捷方式,只需执行以下操作:
var 标签 = 行。Split(new string[] { "<#Tag" }, StringSplitOptions.None);foreach(标签中的var标签){ 现在解析每一个}
我看到 tchelidze 刚刚发布了看起来不错的正则表达式,所以我会把这个答案作为正则表达式。
您也可以在按
常量值拆分字符串后收集它们 <#Tag(
并)>
如下所示:
string str = "<#Tag(value1)> <#Tag(value2)> <#Tag(value3)>";
string[] values = str.Split(new string[] { "<#Tag(", ")>" }, StringSplitOptions.RemoveEmptyEntries);
值包含:
value1, value2, value3
在消息框中显示结果:
foreach (string val in values) {
if (!(String.IsNullOrEmpty(val.Trim()))) {
MessageBox.Show(val);
}
}
根据您的评论进行编辑:
我可以在一个消息框中显示完整的值1值2值3,而不是逗号,而是具有与以前相同的间距
string text = "";
foreach (string val in values) {
text += val;
}
MessageBox.Show(text);
根据评论:现在最后一个查询 在消息框中显示它之前,我想用他们的值替换它,例如 10 20 和 30
string text = "";
foreach (string val in values) {
// where val is matching your variable (let's assume you are using dictionary for storing the values)
// else is white space or other... just add to text var.
if (yourDictionary.ContainsKey(val)) {
text += yourDictionary[val];
} else {
text += val;
}
}
MessageBox.Show(text);