Regex允许用户键入时间-C#

Regex允许用户键入时间-C#,c#,regex,textbox,C#,Regex,Textbox,许多其他问题给出了只允许完全完成时间的正则表达式的答案,如:^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$ 但这在Textbox.TextChanged事件中没有用,因为在键入15:45时,文本框将包含与上述表达式不匹配的15: 是否有一种简单的方法可以允许正则表达式的部分匹配,以确保半类型的时间仍在流逝,或者我必须将表达式分解为所有由或分隔的部分,例如?您可以手动调整这些模式以允许部分匹配。需要记住的一点是,它们只适用于实时验证,而不适用于最终验证。要执行最

许多其他问题给出了只允许完全完成时间的正则表达式的答案,如:
^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$

但这在
Textbox.TextChanged
事件中没有用,因为在键入
15:45
时,文本框将包含与上述表达式不匹配的
15:


是否有一种简单的方法可以允许正则表达式的部分匹配,以确保半类型的时间仍在流逝,或者我必须将表达式分解为所有由
分隔的部分,例如?

您可以手动调整这些模式以允许部分匹配。需要记住的一点是,它们只适用于实时验证,而不适用于最终验证。要执行最终验证,您需要使用一个没有可选部分的完整模式(或者只使用那些强制性可选部分)

因此,该技术包括使用嵌套可选项,如
(?:…(?:…)?

详细信息

  • ^
    -字符串的开头
  • (?:
    -启动可选的非捕获组
    • (?:
      -启动可选的非捕获组
      • [01]?[0-9]
        -可选的
        0
        1
        ,然后是任意1位数字
      • |
        -或
      • 2[0-3]
        -
        2
        然后是从
        0
        3
    • -可选非捕获组的结束
  • (?:
    -启动可选的非捕获组
    • -冒号
    • (?:
      -启动可选的非捕获组
      • [0-5][0-9]?
        -从
        0
        5
        的数字,然后是任意可选数字
    • )?
      -可选非捕获组的结束
    • )?
      -可选非捕获组的结束
  • )?
    -可选非捕获组的结束
  • $
    -字符串结束

你在寻找
MaskedTextBox
?你可以手动调整模式以使用可选组,比如完美的@WiktorStribiżew-如果你将其作为答案发布,我会接受它?更传统的做法是像
^(?:[01][0-9]?| 2[0-3](?::(?:[0-5][0-9])?)?)?)?$否则你会失去选择的踪迹。
^(?:(?:[01]?[0-9]|2[0-3])(?::(?:[0-5][0-9]?)?)?)?$