许多其他问题给出了正则表达式的答案,这些表达式只允许完全完成的时间,如 this : ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
但这在 Textbox.TextChanged
事件中没有用,因为在键入 15:45
时,文本框将包含 15:
而它不t 匹配上面的表达式。
是否有一种简单的方法允许 Regex 表达式的部分匹配以确保半键入时间仍然过去,或者我是否必须将表达式分解成由 或
分隔的部分, 比如 this ?
最佳答案
您可以手动调整此类模式以允许部分匹配。要记住的一件事是,它们只适用于实时验证,不适用于最终验证。要执行最终验证,您需要使用没有可选部分(或只有那些强制性可选部分)的完整模式。
因此,该技术包括使用嵌套的可选 non-capturing groups ,比如 (?:...(?:...)?)?
。
^(?:(?:[01]?[0-9]|2[0-3])(?::(?:[0-5][0-9]?)?)?)?$
参见 regex demo
详细信息:
^
- 字符串的开始(?:
- 可选非捕获组的开始(?:
- 可选非捕获组的开始[01]?[0-9]
- 可选的0
或1
,然后是任意 1 数字|
- 或2[0-3]
-2
然后是从0
到3
的数字
)
- 可选非捕获组的结尾
(?:
- 可选非捕获组的开始:
- 冒号(?:
- 可选非捕获组的开始[0-5][0-9]?
- 从0
到5
的数字,然后是任何可选数字
)?
- 可选的非捕获组结束)?
- 可选的非捕获组结束
)?
- 可选的非捕获组结束$
- 字符串结尾。
关于c# - 允许用户输入时间的正则表达式 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45200048/