操作Regex C#中的匹配值

本文关键字:Regex 操作 | 更新日期: 2023-09-27 18:04:08

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

 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+变成=,并且数量保持不变。

操作Regex C#中的匹配值

使用捕获组:

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

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

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

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

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

请参阅:https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110(.aspx