簡體   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