[英]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.