【问题标题】:Manipulating Matched values in Regex C#在正则表达式 C# 中操作匹配的值
【发布时间】:2015-10-12 14:22:50
【问题描述】:

我已经阅读了一个文本文件并匹配了我感兴趣的数据。我的问题是,操作我匹配的数据的最佳方法是什么? 我正在读取文本文件的代码是。

 OpenFileDialog dialog = new OpenFileDialog();
       dialog.Filter =
          "All files (*.*)|*.*";
       //dialog.InitialDirectory = "C:\\";
       dialog.Title = "Select a text file";

       if (dialog.ShowDialog() == DialogResult.OK)
       {
           string fname = dialog.FileName; // selected file
           label1.Text = fname;
           if (String.IsNullOrEmpty(richTextBox1.Text))
           {
               var matches1 = Regex.Matches(System.IO.File.ReadAllText(fname), @"L10 P\d\d\d R \S\S\S\S\S\S\S")
          .Cast<Match>()
          .Select(m => m.Value)
          .ToList();

               richTextBox1.Lines = matches1.ToArray();
           }

结果现在看起来像:

L10 P015 R +4.9025

我需要它看起来像这样:

#2015=4.9025

排除L10P015变成#2015R+变成=,数量不变。

【问题讨论】:

    标签: c# arrays regex text richtextbox


    【解决方案1】:

    使用捕获组:

    • 首先将您的正则表达式更改为:

      L10 P(?<key>\d{3}) R \S(?<val>\S{6})
      

      (?&lt;name&gt;...) 语法允许您声明一个命名的捕获组。您可以稍后检索与该组匹配的值。

    • 接下来,当你有一个匹配对象时,你可以用match.Groups["key"].Valuematch.Groups["val"].Value提取匹配组内容,像这样:

      .Select(m => string.Format("#2{0}={1}", m.Groups["key"].Value, m.Groups["val"].Value))
      

    【讨论】:

    • 效果很好!!谢谢。
    • 如果我想在 15 上加 2000,可以使用基本相同的方法吗?我问的原因是我有另一种使用 2200 而不是 2000 的格式。如果我的 P015 最终是 P125,那么我的结果将需要是 2325。
    • @user2139891 确定:string.Format("#{0}={1}", int.Parse(m.Groups["key"].Value) + 2000, m.Groups["val"].Value)
    【解决方案2】:
    var matches = Regex.Matches(System.IO.File.ReadAllText(fname), @"L10 P\d\d\d R \S\S\S\S\S\S\S")
          .Cast<Match>()
          .Select(m => m.Value)
          .ToList();
    
    string num1 = "2" + matches[1].Substring(1); // "2" + "015"
    string num2 = matches[3].Substring(1); // "4.9025"
    
    string finalValue = "#" + num1 + "=" + num2; // "#2015=4.9025"
    richTextBox1.Text = finalValue;
    

    根据您的单个示例,我相信这应该可行。

    这假设我们只是总是忽略P015项目的第一个字符和+4.9025项目的第一个字符。

    【讨论】:

      【解决方案3】:

      你为什么不简单地拆分接收流,你的规则是基本的,不需要正则表达式。

          string receivingStream = "L10 P015 R +4.9025";
          string[] tokens = receivingStream.Split(new char[] { ' ' });
      
      • 令牌[0] == L10
      • 令牌[1] == 日期
      • 令牌[2] == R
      • 令牌[3] == 数量

      【讨论】:

        【解决方案4】:

        您希望使用Regex.Replace 对字符串进行一次变异,而不是通过所有这些匹配。您需要向正则表达式添加分组,并在替换字符串中使用替换。

        见: https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          相关资源
          最近更新 更多