用户文本输入的乐观RegEx匹配

时间:2011-02-15 17:41:49

标签: c# regex

我正在开发一个使用正则表达式来验证用户输入的文本输入应用程序。目标是允许符合某个RegEx的按键,同时拒绝无效字符。我遇到的一个问题是,当用户开始输入信息时,他们可能会创建一个尚未匹配给定正则表达式的字符串,但可能导致将来匹配。这些字符串被错误地拒绝了。这是一个例子 - 给出以下用于输入日期信息的正则表达式:

(0?[1-9]|10|11|12)/(0?[1-9]|[12]\\d|30|31)/\\d{2}\\d{2}

用户可能会开始输入可能是有效日期的“1 /”,但RegEx.IsMatch()将返回false,我的代码最终会拒绝该字符串。有没有办法“乐观地”对正则表达式测试字符串,以便允许可能的或部分匹配?

奖励:特别是对于这个RegEx,有一些序列会导致所需的字符。例如,如果用户键入“2/15”,则他们可以输入的唯一可能的有效字符是“/”。是否可以检测这些场景,以便自动输入所需的字符以便用户轻松输入?

2 个答案:

答案 0 :(得分:2)

您可以做的是锚定您的RegExp(即添加^和$,如行的开头/结尾)并为验证制作一些组件选项,但如果存在则严格定义。 看起来像这样:

^(0?[1-9]|10|11|12)(/((0?[1-9]|[12]\\d|30|31)(/(\\d{2}(\\d{2})?)?)?)?)?$

我确实觉得它看起来很糟糕但据我所知,只要字符串满足正则表达式模式的开头就没有办法告诉regexp引擎验证。

在我看来,实现您想要做的事情的最佳方法是为日/月/日创建单独的输入,并在离开文本字段时检查它们的值。
 它还提供了更好的可见性和用户体验,因为我相信没有人喜欢阻止在文本字段中键入某些字符,有或没有注意到它们在键入或自动插入斜线时会消失而不另行通知。

答案 1 :(得分:1)

您是否曾经使用过这样的应用程序或表单,只是拒绝接受任何不喜欢的按键?如果答案是肯定的,那么每次按错键时它是否会吹掉电子覆盆子?

如果您确实需要在提交表单之前验证输入,请使用被动反馈机制,如文本字段周围的红色边框,消失正则表达式与输入匹配。此外,请确保附近有“帮助”按钮或工具提示,以提供建设性反馈。

当然,最好的选择是使用像日期条目小部件这样的专用控件。但无论你做什么,都不要这样做,以至于感觉你正在和用户一起猜猜游戏。