我对正则表达式的概念并不陌生,但有时候一切的语法和语义都让我感到困惑。我一直在尝试创建一个识别
的模式Ambient Relative Humidity: 31.59
使用分组
Ambient Relative Humidity (Group 1)
31.59 (Group 2)
但我还需要能够匹配诸如
之类的东西Operator: Bob
使用分组
Operator (Group 1)
Bob (Group 2)
或者
Sensor Number: 0001
使用分组
Sensor Number (Group 1)
0001 (Group 2)
这是我创建的当前模式,适用于涉及操作员和传感器编号的示例,但与第一个示例(环境湿度)不匹配
\s*([A-Za-z0-9]*\s*?[A-Za-z0-9]*)\s*:\s*([A-Za-z0-9]*)
答案 0 :(得分:2)
您必须在正则表达式中添加更多空格分隔的关键部分 此外,您必须在值中添加十进制数的选项。
像这样([A-Za-z0-9]*(?:\s*[A-Za-z0-9]+)*)\s*:\s*((?:\d+(?:\.\d*)?|\.\d+)|[A-Za-z0-9]+)?
https://regex101.com/r/fl0wtb/1
解释
( # (1 start), Key
[A-Za-z0-9]*
(?: \s* [A-Za-z0-9]+ )*
) # (1 end)
\s* : \s*
( # (2 start), Value
(?: # Decimal number
\d+
(?: \. \d* )?
| \. \d+
)
| # or,
[A-Za-z0-9]+ # Alpha num's
)? # (2 end)
答案 1 :(得分:1)
我可能在没有想到的情况下过早发布,我现在有以下表达式
\s*([A-Za-z0-9]*\s*[A-Za-z0-9]*\s*[A-Za-z0-9]*)\s*:\s*([A-Za-z0-9.]*)
唯一的问题是它有时包含我试图避免的空间,但我可以稍后修剪它们。很抱歉发布这么快!
答案 2 :(得分:0)
var st = "Ambient Relative Humidity: 31.59 Operator: Bob Sensor Number: 0001";
var li = Regex.Matches(st, @"([\w]+?:)\s+(\d+\.?\d+|\w+)").Cast<Match>().ToList();
foreach (var t in li)
{
Console.WriteLine($"Group 1 {t.Groups[1]}");
Console.WriteLine($"Group 2 {t.Groups[2]}");
}
//Group 1 Humidity:
//Group 2 31.59
//Group 1 Operator:
//Group 2 Bob
//Group 1 Number:
//Group 2 0001