在 Regex C# 中操作匹配值

Manipulating Matched values in Regex C#

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

 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

L10被排除,P015变为#2015R+变为=,数字保持不变一样。

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项的第一个字符。

使用捕获组:

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

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

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

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

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

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

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

您想使用 Regex.Replace 来改变字符串一次,而不是经历所有这些匹配。您需要向正则表达式添加分组,并在替换字符串中使用替换。

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