【问题标题】:Optimistic RegEx Matching for User Text Entry用户文本输入的乐观正则表达式匹配
【发布时间】:2011-02-15 17:41:48
【问题描述】:

我正在开发一个使用正则表达式来验证用户输入的文本输入应用程序。目标是在拒绝无效字符的同时允许适合某个 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”,他们接下来可以输入的唯一可能的有效字符是“/”。是否可以检测到这些场景,以便自动输入所需的字符以方便用户输入?

【问题讨论】:

  • 您是否有理由在每次击键时检查而不是在用户离开时检查?尝试在用户键入时进行验证通常非常困难,并且最终会在用户想要编辑时非常烦人。
  • 记住“del”键 :-) 当用户转到 char 0 并按 del 时会发生什么?

标签: c# regex


【解决方案1】:

您可以做的是锚定您的正则表达式(即添加 ^ 和 $,如行首/行尾),并使某些组件可选用于验证,但如果存在则严格定义。 看起来像这样:

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

我确实意识到它看起来很糟糕,但据我所知,只要字符串满足正则表达式模式的开头,就无法告诉正则表达式引擎进行验证。

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

【讨论】:

    【解决方案2】:

    您是否曾经使用过以这种方式工作的应用程序或表单,只是拒绝接受它不喜欢的任何按键?如果答案是肯定的,是否每次按错键都会吹出电子树莓?

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

    当然,最好的选择是使用像日期输入小部件这样的专用控件。但无论你做什么,都不要让你觉得你在和用户玩猜谜游戏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多