所以我在输入中有一个表示持续时间格式的字符串。这种格式可以是各种类型,如:“hh:mm:ss”或“sssss”或“”hhmmss“等......
我的目标是了解用户插入的此字符串是否为有效格式。直到现在我做了什么:
Regex rgx = new Regex("[^a-zA-Z0-9 ]");
input = rgx.Replace(input, string.Empty);
此时我有一个字符串,格式应为“hhmmss”或“sssss”或“mmss”。我需要检查用户是否错误地插入了一些拼写错误,使用此有效块列表执行Regex.Match
List<string> entry = new List<string> {
"h", "hh", "hhh", "hhhh",
"m", "mm", "mmm", "mmmm", "mmmmm",
"s", "ss", "sss", "ssss", "sssss" };
我该怎么做?
编辑:我会尝试解释一些问题。首先,在我的工具的这个阶段,我只需要检查用户的输入是否有效。有效,我的意思是,用户将输入的任何格式(使用分隔符或不分隔符),它至少由第二个块组成。我认为用户不会做input = hsssmhhmms
这样的事情,因为它没有任何意义。我承认的唯一一件事就是拼写错误(例如按“g”而不是“h”)。当然问题仍然很难,因为这些数据块可以包含在多个表格中。这就是为什么我做了第一步,在紧凑的块上工作。
答案 0 :(得分:2)
为什么不尝试格式化?如果系统可以格式化,则userFormat
格式正确:
private static bool IsValidFormat(string userFormat) {
// Gini pig
TimeSpan sample = new TimeSpan(1234567);
string escaped = string.Concat(userFormat
.Select(c => char.IsLetter(c) || c == '%'
? c.ToString()
: "\\" + c.ToString())); // delimiters like :,;+... should be escaped
try {
sample.ToString(escaped);
return true;
}
catch (FormatException) {
return false;
}
}
...
// is this allowed? - true
Console.WriteLine(IsValidFormat(@"hh;mm;;ss+++ffff*h"));
// is this allowed? - false
Console.WriteLine(IsValidFormat(@"zzzz"));
答案 1 :(得分:1)
你能确定订购吗? (H-&GT;间 - &GT; S) 然后是:
var match = Regex.Match(input, "^([h]{0,4})[:]?([m]{0,5})[:]?([s]{0,5})$");
if (match.Success)
{
string hours = match.Groups[1].Value;
string mins = match.Groups[2].Value;
string secs = match.Groups[3].Value;
}
如果不是:
var match = Regex.Match(tbName.Text, "^([h]{0,4}|[m]{0,5}|[s]{0,5})[:]?([h]{0,4}|[m]{0,5}|[s]{0,5})[:]?([h]{0,4}|[m]{0,5}|[s]{0,5})$");
if (match.Success)
{
string hours = match.Groups.Cast<Group>().Skip(1).Select(x => x.Value).FirstOrDefault(x => x.Contains('h'));
string mins = match.Groups.Cast<Group>().Skip(1).Select(x => x.Value).FirstOrDefault(x => x.Contains('m'));
string secs = match.Groups.Cast<Group>().Skip(1).Select(x => x.Value).FirstOrDefault(x => x.Contains('s'));
}
You can test these Expressions here:
<强> PS:强>
如果您将:
替换为\W_
,则会允许其他非字字符(,; -_?等)
?
代表零或一。 - &GT;你可以只有其中一个。
*
允许零个或多个非单词字符。 - &GT;所以你可以有:"hhh_-_--,.,;;mm,ssss"