操作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
变成#2015
,R
和+
变成=
,并且数量保持不变。
使用捕获组:
-
首先将正则表达式更改为:
L10 P(?<key>'d{3}) R 'S(?<val>'S{6})
(?<name>
。。。)
语法允许您声明一个命名的捕获组。您稍后可以检索此组匹配的值。 -
接下来,当您有一个匹配对象时,您可以使用
match.Groups["key"].Value
和match.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