如何编写这个Regex表达式?

时间:2017-06-21 11:07:49

标签: c# regex

所以我在输入中有一个表示持续时间格式的字符串。这种格式可以是各种类型,如:“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”)。当然问题仍然很难,因为这些数据块可以包含在多个表格中。这就是为什么我做了第一步,在紧凑的块上工作。

2 个答案:

答案 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"