从文件 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);
        }
    }
}

从文件 C# 获取文本

尝试关注

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);