我不知道如何在c#中使用正则表达式,或者如何解决我的问题

我不知道如何在c#中使用正则表达式,或者如何解决我的问题,c#,regex,winforms,C#,Regex,Winforms,我有以下问题:我无法从winforms中的另一个文本框(分别是C#)中提取特定字符串: TextboxA中显示以下字符串(它是多行的。每个“”都是一行): 在文本框1中,只需显示“103,2”。文本框2“-0,54”、文本框3“0,25”和文本框4分别为“46,41”。 我的C#项目的命名空间不允许浮点值或双精度值。因此,文本框1-4中必须有字符串值。因此float.Parse(stringTextboxA);方法不起作用。如何用正则表达式求解它 我已经试过了: const string Mea

我有以下问题:我无法从winforms中的另一个文本框(分别是C#)中提取特定字符串:

TextboxA中显示以下字符串(它是多行的。每个“”都是一行):

在文本框1中,只需显示“103,2”。文本框2“-0,54”、文本框3“0,25”和文本框4分别为“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#程序员和“正则表达式”专家能告诉我一些关于我的问题吗?提前谢谢

致以最诚挚的问候

请尝试以下内容:

        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];
            }

        }
public Form1()
{
初始化组件();
textBox5.Multiline=true;
文本框5.文本=
“OUT01:有效的\uuuuu GO\uuuuuu103,2\r\n”+
“OUT02:有效的\uuuuuuuuuuuuuuuu0,54\r\n”+
“OUT03:有效的\uuuu GO\uuuuu\0,25\r\n”+
“OUT04:有效的\r\n低46,41”;
列表框=新列表(){textBox1,textBox2,textBox3,textBox4};
字符串模式=@“[\d,\-\+]+\r\n”;
MatchCollection matches=Regex.matches(textBox5.Text,pattern);
string[]values=matches.Cast().Select(x=>x.Value.Trim()).ToArray();
for(int i=0;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”,然后查找等于“-”或“0-9”的1个或多个“{1,2}”字符,然后必须找到一个逗号,然后正好是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”


试试看。你可以像我在这里做的那样测试你的正则表达式:

它本身就是一个量词。如果您勾选此项,您可以看到使用
(*)
,asterix红色和is表示前面的标记不可量化

您可以将其设置为
(.*)
,但点与任何字符都匹配,并且与十进制值完全匹配


获取值的一个选项可以是使用量词
\s{2,}
来确定空格数

要匹配GO和LO变体中的任何一个,您可以使用交替
|
来匹配它们中的任何一个

十进制值可以在组1中捕获

^\s+OUT\d+: Valid\s{2,}(?:__GO__|____LO)\s{2,}(-?\d+(?:,\d+)?)$
解释

  • ^
    字符串的开头
  • \s+OUT\d+:有效的
    匹配字符串的开头,使用
    \d+
    匹配1+个数字
  • \s{2,}
    匹配2个或多个空白字符
  • (?:
    备选方案的非捕获组
    |
    • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    • |
    • \uuuuuuuuuuuu LO
      也按字面意思匹配
  • 关闭非捕获组
  • \s{2,}
    匹配2个或多个空白字符
  • (?\d+(?:,\d+)
    捕获组1,匹配可选的
    -
    ,1+位和可选的小数部分
  • $
    字符串结尾


您可以在不使用正则表达式的情况下执行此操作,以满足您的要求,按新行拆分文本,然后按空格拆分行的最后一个值。
我希望你的c#项目的名称空间不会强迫你使用正则表达式


我建议使用更合适的控件来显示集合,例如listbox或datagridview或多行文本框。

var match=Regex.match(MeasurementValue1,@“OUT01:\s+Valid\s+\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu+(\d+)?。组[1]。值?我不会为此使用正则表达式。我只需要在换行符上拆分文本,然后在每行中搜索第一个空格,从右开始,从左开始。然后根据该字符位置拉出子字符串。或者要匹配所有十进制值
out\d+:Valid(?:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu LO)(?\d+(?:,\d+)
在已经尝试过的代码中,您试图匹配的字符串中没有任何实际数字,因此无论得到什么匹配都将为空。您也不能只为任何字符匹配
*
-您的意思是
*
。如果您的字段如示例中所示为常量,那么从位置27开始的简单子字符串就可以了?否则我喜欢@BradleyUffner的解决方案。根据regex演示,这似乎是最有效的。不幸的是,我不能使用索引操作符,因为我的项目是用C#Version 7.3编写的,而索引操作符至少需要C#Version 8.0。我无法更改构建的C#版本,因为语言版本基于我项目的框架版本…啊,当然:你是对的!它本身只是一个量词。我忘记了“(.*)”中的“.”。@s950mpc2000如果您只想要匹配项,可以使用正向查找
(?我用您的正则表达式编写了以下代码
字符串模式=@”(?@s950mpc2000如果这是设置值
txb_Textbox1.Text=
的方法,且值位于
m.value
中,则一个选项是通过索引从中获取值,并将
m.value
分配给
.Text
属性。或者可以使用索引循环集合,如果文本框是树结构中的子项,得到父母的第n个孩子。我做了一个变通,因此找到了解决问题的方法。f
^\s+OUT\d+: Valid\s{2,}(?:__GO__|____LO)\s{2,}(-?\d+(?:,\d+)?)$
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];