[英]I cannot wrap my head around on how to use regex in c# or how to solve my problem otherwise
我有以下问题:我无法从 winforms 中的另一个文本框中提取特定字符串,分别为 C#:
在 TextboxA 中显示以下字符串(它是多行的。每个“”都是一行):
" OUT01: Valid __GO__ 103,2"
" OUT02: Valid __GO__ -0,54"
" OUT03: Valid __GO__ 0,25"
" OUT04: Valid ____LO 46,41"
在 Textbox1 中,只需要显示“103,2”。 在 Textbox2 中“-0,54”,在 Textbox3 中“0,25”和在 Textbox4 中分别为“46,41”。 我的 C# 项目的命名空间不允许浮点或双精度值。 因此,在文本框 1-4 中必须有字符串值。 因此 float.Parse(stringTextboxA); 方法不起作用。 如何用正则表达式解决它?
我已经尝试过:
const string MeasurementValue1 = " OUT01: Valid __GO__ ";
var match = Regex.Match(MeasurementValue1, " OUT01: Valid __GO__ (*)");
txb_Textbox1.Text = match;
但这不起作用。 一些更有经验的 C# 程序员和“正则表达式”专家可以告诉我一些我的问题吗? 提前致谢!
此致
*
本身就是一个量词。 如果你在https://regex101.com/r/IYOlyB/1上检查这个,你可以看到使用(*)
,红色星号表示前面的标记是不可量化的。
您可以将其设为(.*)
,但点匹配任何字符,并且是十进制值的广泛匹配。
获取值的一种选择是使用例如量词\s{2,}
来确定空格数。
要匹配GO和LO变体中的任何一个,您可以使用替换|
匹配其中任何一个。
十进制值可以在组 1 中捕获。
^\s+OUT\d+: Valid\s{2,}(?:__GO__|____LO)\s{2,}(-?\d+(?:,\d+)?)$
解释
^
字符串开头\s+OUT\d+: Valid
匹配字符串的开头,使用\d+
匹配1+位数\s{2,}
匹配 2 个或更多空白字符(?:
交替的非捕获组|
__GO__
从字面上匹配|
或者____LO
也匹配字面意思)
关闭非捕获组\s{2,}
匹配 2 个或更多空白字符(-?\d+(?:,\d+)?)
捕获组 1 ,匹配可选的-
、1+ 位和可选的小数部分$
字符串结尾尝试以下操作:
public Form1()
{
InitializeComponent();
textBox5.Multiline = true;
textBox5.Text =
" OUT01: Valid __GO__ 103,2\r\n" +
" OUT02: Valid __GO__ -0,54\r\n" +
" OUT03: Valid __GO__ 0,25\r\n" +
" OUT04: Valid ____LO 46,41\r\n";
List<TextBox> boxes = new List<TextBox>() { textBox1, textBox2, textBox3, textBox4 };
string pattern = @"[\d,\-\+]+\r\n";
MatchCollection matches = Regex.Matches(textBox5.Text, pattern);
string[] values = matches.Cast<Match>().Select(x => x.Value.Trim()).ToArray();
for (int i = 0; i < values.Length; i++ )
{
boxes[i].Text = values[i];
}
}
可以在这里扩展我的评论是您的数据在解析时的样子:
string myText = @""" OUT01: Valid __GO__ 103,2""
"" OUT02: Valid __GO__ -0,54""
"" OUT03: Valid __GO__ 0,25""
"" OUT04: Valid ____LO 46,41""";
int[] colsizes = {@""" OUT01: Valid ".Length, "__GO__ ".Length, 20};
var myData = myText.Split('\n').Select(x => new {
column1 = x.Substring(0, colsizes[0]).Trim(' ', '"'),
column2 = x.Substring(colsizes[0], colsizes[1]).Trim(),
column3 = decimal.TryParse(
x.Substring(colsizes[0]+colsizes[1]).Trim().Replace("\"",""),
NumberStyles.Any, new CultureInfo("tr-TR"), out decimal result)
? result : 0M
});
foreach (var d in myData)
{
Console.WriteLine($"Column1: [{d.column1}], Column2: [{d.column2}], Column3: [{d.column3}]");
}
Form f = new Form();
DataGridView dgv = new DataGridView {Dock=DockStyle.Fill, DataSource=myData.ToList()};
f.Controls.Add(dgv);
f.Show();
PS:要显示数据,请尝试使用 DataGridView 代替文本框。 你有数据行。 编辑以显示在 DataGridView 中。
在您提供的 4 个字符串示例中,此正则表达式将仅匹配您指出需要包含的数字:
"\s[-0-9]{1,},[0-9]{1,2}"
它查找空格“\s”,然后是 1 个或多个等于“-”或“0-9”的“{1,}”字符,然后它必须找到一个逗号,然后正好是 1 个或 2 个“{1,2 }”数字“0-9”。
你会像这样使用它:
var match = Regex.Match(" OUT04: Valid ____LO 46,41", "\s[-0-9]{1,},[0-9]{1,2}");
在这种情况下,匹配应等于“46,41”。
试试看。 您可以像我在这里一样测试您的正则表达式: https://www.regexpal.com/
您可以在没有正则表达式的情况下执行此操作,以满足您的要求,将文本按新行拆分,然后将行的最后一个值用空格拆分。
我希望您的 c# 项目的名称空间不会强迫您使用正则表达式。 ;)
textboxA.Text = @"
OUT01: Valid __GO__ 103,2
OUT02: Valid __GO__ -0,54
OUT03: Valid __GO__ 0,25
OUT04: Valid ____LO 46,41
";
var withoutEmptyValues = StringSplitOptions.RemoveEmptyEntries;
var values = textboxA.Text
.Split(new[] { Environment.NewLine }, withoutEmptyValues)
.Select(line => line.Split(new[] { " " }, withoutEmptyValues).Last())
.ToArray();
textBox1.Text = values[0];
textBox2.Text = values[1];
textBox3.Text = values[2];
textBox4.Text = values[3];
我建议使用更合适的控件来显示 collections,例如列表框或数据网格视图或多行文本框。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.