Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写这个正则表达式?_C#_Regex - Fatal编程技术网

C# 如何编写这个正则表达式?

C# 如何编写这个正则表达式?,c#,regex,C#,Regex,所以我在输入中有一个字符串,它表示一个持续时间的格式。此格式可以是多种类型,如:“hh:mm:ss”或“sssss”或“hhmmss”等 我的目标是了解用户插入的此字符串是否为有效格式。到目前为止,我所做的是: Regex rgx = new Regex("[^a-zA-Z0-9 ]"); input = rgx.Replace(input, string.Empty); 此时,我有一个字符串,其格式应为“hhmmss”或“sssss”或“mmss”。我需要检查用户是否错误地插入了一些打字错误

所以我在输入中有一个字符串,它表示一个持续时间的格式。此格式可以是多种类型,如:“hh:mm:ss”或“sssss”或“hhmmss”等

我的目标是了解用户插入的此字符串是否为有效格式。到目前为止,我所做的是:

Regex rgx = new Regex("[^a-zA-Z0-9 ]");
input = rgx.Replace(input, string.Empty);
此时,我有一个字符串,其格式应为“hhmmss”或“sssss”或“mmss”。我需要检查用户是否错误地插入了一些打字错误,使用此有效块列表进行正则表达式匹配

List<string> entry = new List<string> { 
  "h", "hh", "hhh", "hhhh", 
  "m", "mm", "mmm", "mmmm", "mmmmm", 
  "s", "ss", "sss", "ssss", "sssss" };
List entry=新列表{
“h”,“hh”,“hhh”,“hhh”,
“m”、“mm”、“mmm”、“mmmm”、“mmmm”,
“s”、“ss”、“sss”、“ssss”、“ssss”};
我该怎么做

编辑:我将尝试解释一些要点。首先,在我的工具的这一阶段,我只需要检查用户的输入是否有效。使用valid,我的意思是,用户将输入的任何格式(带分隔符或不带分隔符),它至少由一个秒组成。我相信用户不会做任何像
input=hsssmhhmms
这样的事情,因为它没有任何意义。我唯一要承认的是输入错误(例如,它按“g”而不是“h”)当然,问题仍然很难解决,因为这些数据块可以包装在多个表单中。这就是为什么我要做第一步,处理一个紧凑的数据块。

为什么不尝试格式化?如果系统可以格式化,那么
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"));

你能确定它是订购的吗?(h->m->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'));
}
var match=Regex.match(tbName.Text,“^([h]{0,4}}{0,5}}}[s]{0,5}[:]?([h]{0,4}}[m]{0,5}[s]{0,5}[:]([h]{0,4}}[s]{0,5}]);
如果(匹配成功)
{
字符串hours=match.Groups.Cast().Skip(1).Select(x=>x.Value).FirstOrDefault(x=>x.Contains('h'));
string mins=match.Groups.Cast().Skip(1).Select(x=>x.Value).FirstOrDefault(x=>x.Contains('m');
string secs=match.Groups.Cast().Skip(1).Select(x=>x.Value).FirstOrDefault(x=>x.Contains('s');
}

PS:

如果将
替换为
\W\u
将允许其他非单词字符(,;-?等)

代表零或一。->两者之间只能有一个


*
允许零个或多个非单词字符。->因此您可以使用类似以下内容:
“hhh-”,。,;;嗯,ssss“

到目前为止,您尝试了什么?您不知道如何在检查中使用替代值吗?(即
(a | b)
),你不知道如何找到一个组的一个或多个匹配项吗?还有什么?允许使用什么分隔符?你可以拥有的块的数量有限制吗?@AlexK:我认为这不是OP想要的。我相信输入可以是该列表中项目的组合,可能有一个
分隔符。我感觉你在尝试实现一些非常广泛的功能…在检查有效性之后,您下一步将如何处理输入?我个人认为正则表达式不是这项工作的最佳选择。我会将字符串拆分为多个部分,然后检查每个部分是否有效。这样,您也可以更容易地拥有类似“您只能有一个包含m的组”这样的逻辑(我假设
m:mm:mm
可能是无效的)。@克里斯不一定同意这个独特的团体想法……将
“ddd,d mmm yyyy”
作为一种模式,一周中的一天之后是一个月中的一天。我不确定你是否会转义……你说的“如果系统可以格式化,那么userFormat是正确的”"看起来很合理,但您实际测试的字符串不是用户提供的字符串,因为您可能已经转义了一堆东西?可能是OP想要进行一些转义,但他们没有提供这方面的指示,如果需要转义,我认为它应该独立于验证-否则您返回true以说明其正确性有效,然后必须确保在其他地方重新进行转义…@Chris:你说得很对;更好的做法是将用户提供的格式,即
hh:mm:ss
转换为系统
hh\:mm\:ss
所需的字符串一次,然后对其进行测试,如果测试通过,则解析/格式化实际数据e问题说明“格式可以是各种类型,如:
“hh:mm:ss”
…如果用户插入的此字符串是有效格式…”;因为
“hh:mm:ss”
应该是一种有效的格式,我添加了转义。这很有意义。感谢您的澄清。问题是,最后,我需要将用户的输入转换为表示总秒数的整数。加上@Chris,我肯定不需要有效的格式,否则我所有的担心都不存在。我必须检查如果用户想要插入的内容是有效的。而且,输入可以显示为单个块,而不是分开。我标记了您的答案,因为它解决了我理解格式是否有效的问题。但是,我想指出,您的解决方案的第二部分,仅在第一种情况下有效(即顺序为h->m->s)。在第二种情况下,3个字符串都是相同的,并且等于输入,而在第一种情况下,它被正确地分割了。谢谢你的反馈!我不完全明白你的意思。第二个正则表达式匹配由零或一分隔的任何h/s/m组合
::“hhmmss”“hh:mmss”“ss:mmhh”“mmhhss”“ss”“ss:hhh”“ss”..…正则表达式将输入分成3个组。如果输入不包含一个或多个s/m/h,则匹配包含空组。示例:input=“sss”匹配:完全匹配:“sss”组1:“组2:”组3:“sss”是的,我得到的是
tring hours=match.groups.Cast()。选择(x=>x.Value)。FirstOrDefault(x=>x.contains('h'))
part确实如此。我要指出的是,如果订单不能是h->m->s(即您的第二个解决方案),它将无法按预期工作。例如,以这种情况为例。用户将输入写为“mmss”。匹配成功,但输出字符串将是:小时=null,分钟=mmss,秒