在 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
变为#2015
,R
和+
变为=
,数字保持不变一样。
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"].Value
和match.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
我读取了一个文本文件并匹配了我感兴趣的数据。我的问题是,操作我匹配的数据的最佳方式是什么? 我正在阅读文本文件的代码是。
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
和+
变为=
,数字保持不变一样。
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"].Value
和match.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