我已经阅读过多篇关于此的主题,但我无法理解。
我有这种特定类型的字符串格式:8Y4H20M。 我需要获得3个不同的变量
Year=8
Hours=4
Minutes=20
首先我完成了这个,因为字符串可以有空格
var cadena = tiempo.ToUpper()。Trim(); // Saco todos los espacios que haya en las cadenas cadena = string.Join(“”,cadena.Split(default(string []),StringSplitOptions.RemoveEmptyEntries));
var cont = 0;
//int dia = 0, hora = 0, minutos = 0;
string[] numbers = Regex.Split(cadena, @"\D+");
foreach (string value in numbers)
{
if (!string.IsNullOrEmpty(value))
{
if (cont == 0)
{
minutos += (Convert.ToInt32(value))*480;
cont++;
}
else if (cont == 1)
{
minutos += (Convert.ToInt32(value))*60;
cont++;
}
else if (cont == 2)
{
minutos += (Convert.ToInt32(value));
cont++;
}
}
}
但是例如。如果字符串是“8H7M”或“19Y”,这不起作用。我必须搜索特定的字符并将它们放在变量中。
由于
答案 0 :(得分:0)
我建议使用一个易于理解的小规则正则表达式来将匹配详细信息收集到字典中:
var result = Regex.Matches(s, @"(?<num>[0-9]+)\s*(?<unit>[mhy])", RegexOptions.IgnoreCase)
.Cast<Match>()
.ToDictionary(x => x.Groups["unit"].Value, m => m.Groups["num"].Value);
请参阅regex demo。 (?<num>[0-9]+)\s*(?<unit>[mhy])
匹配:
(?<num>[0-9]+)
- 一个或多个(+
)个数字([0-9]
)并将结果放入“num”组\s*
- 0+空白符号(?<unit>[mhy])
- 3个字母中的1个,以不区分大小写的方式(由于使用了标记):m
,h
或y
,放入“单位”单元” string s = "8Y4H20M 8H7M 8 h 7 M 19 y 19Y";
MatchCollection result = Regex.Matches(s, @"(?<num>[0-9]+)\s*(?<unit>[mhy])", RegexOptions.IgnoreCase);
foreach (System.Text.RegularExpressions.Match m in result) {
Console.WriteLine("{0} / {1}", m.Groups["unit"].Value, m.Groups["num"].Value);
输出:
Y / 8
H / 4
M / 20
H / 8
M / 7
h / 8
M / 7
y / 19
Y / 19