我不知道如何在c#中使用正则表达式,或者如何解决我的问题
我有以下问题:我无法从winforms中的另一个文本框(分别是C#)中提取特定字符串: TextboxA中显示以下字符串(它是多行的。每个“”都是一行): 在文本框1中,只需显示“103,2”。文本框2“-0,54”、文本框3“0,25”和文本框4分别为“46,41”。 我的C#项目的命名空间不允许浮点值或双精度值。因此,文本框1-4中必须有字符串值。因此float.Parse(stringTextboxA);方法不起作用。如何用正则表达式求解它 我已经试过了:我不知道如何在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
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+:有效的
匹配1+个数字\d+
匹配2个或多个空白字符\s{2,}
备选方案的非捕获组(?:
|
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
或|
也按字面意思匹配\uuuuuuuuuuuu LO
关闭非捕获组)
匹配2个或多个空白字符\s{2,}
捕获组1,匹配可选的(?\d+(?:,\d+)
,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];