繁体   English   中英

我无法理解如何在 c# 中使用正则表达式或如何解决我的问题

[英]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,}来确定空格数。

要匹配GOLO变体中的任何一个,您可以使用替换| 匹配其中任何一个。

十进制值可以在组 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+ 位和可选的小数部分
  • $字符串结尾

.NET 正则表达式演示

在此处输入图像描述

尝试以下操作:

        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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM